哎前端,自己就没踏踏实实学过前端的玩意儿,嚷嚷着要学vue要学angular,结果都是接触个皮毛,完后屁颠屁颠回去学Java了...,今天项目需要,学学express,一个基于NodeJS的快速开发web应用的框架(属于Nodejs的后端框架),目的是学会基本使用。vue这些前端框架回头专门记录学学(我也好想会做好看的前端呜呜呜)
入门demo
首先新建一个目录然后npm init
来初始化这个工程,主要是生成package.json
这个依赖管理文件,然后我们npm install express --save
来安装express,可以自定义入口为app.js(一般的习惯),然后代码如下:
1 | const express = require('express') |
然后node app.js
就可以启动应用了,访问根目录就可以看到我们绑定的路由以及对应的handler函数了。
当然一般可以使用express-generator
来完成这个工作,安装:npm install -g express-generator
。然后就可以新建工程了,比如:
然后在其目录下npm install
安装依赖就可以了。最后的目录结构如下:
1 | ├── app.js |
如果你要在视图层使用html作为模板文件的话,需要在app.js中修改他的默认模板引擎,并且要安装ejs模块(npm install ejs --save),修改后的代码如下:
1 | // view engine setup |
这样就可以使用html文件了。
路由设置
首先我们来确立几个基本概念,就照着上面的demo(这里再粘贴一下):
1 | const express = require('express') |
首先app
这个变量,它是express的一个实例,下面我们定义了一条路由规则:
1 | app.get('/', (req, res)=>{ |
定义路由规则的语法是这样的:app.METHOD(URL, HANDLER)
,其中Handler由请求和响应组成,比如上面的代码中就用响应变量res
回执了一个字符串。
URL路径
官方给了几个例子,分别对应不同的HTTP请求:
1 | // 请求根 |
路由参数
当然我们也要处理用户传递的数据的,老规矩,get的参数或者post的参数呗。先看get的,处理方法类似go语言:
1 | app.get('/users/:userId/books/:bookId', function (req, res) { |
上面这个url传递过来后,就可以拿到userId和bookId这两个变量
当然,你也可以用这种骚气一点的处理方式:
1 | // 带个'-'来匹配get的参数 |
处理程序(Handler)
上面demo的例子只有一个handler函数,实际上也可以组合使用多个handler函数进行跳转,比如:
1 | const express = require('express') |
我们就可以在控制台看到跳转,以及最终回显的结果
-基于NodeJS的Web框架/image-20210714142325049.png)
-基于NodeJS的Web框架/image-20210714142212956.png)
当然你也可以单独独立定义函数,然后组成数组,交由app来进行管理:
1 | const express = require('express') |
-基于NodeJS的Web框架/image-20210714142724475.png)
-基于NodeJS的Web框架/image-20210714142731697.png)
上面的例子是都绑定到了get方法,此外,你也可以将这些方法绑定到不同的方法里:
1 | app.route('/book') |
比如上面的代码就把不同的处理程序绑定到了/book
路径下的不同请求方法中。
响应可执行的方法(Method)
如果以下的方法没有被调用的话,服务端和客户端的通信将一直挂起。比如我们demo里的send方法就可以结束一次请求-响应的循环。
Method | Description |
---|---|
res.download() | Prompt a file to be downloaded. |
res.end() | End the response process. |
res.json() | Send a JSON response. |
res.jsonp() | Send a JSON response with JSONP support. |
res.redirect() | Redirect a request. |
res.render() | Render a view template. |
res.send() | Send a response of various types. |
res.sendFile() | Send a file as an octet stream. |
res.sendStatus() | Set the response status code and send its string representation as the response body. |
express.Router()
定义Handler的方式可能有点乱,还有一种模块化的管理路由的方式就是使用express.Router
,我们单独在一个文件中写路由规则,然后导出这个模块使用即可。一个例子如下:
首先我们使用express初始化后的工程,在routers/index.js
文件中写我们的规则:
1 | var express = require('express'); |
然后 views
下写我们的视图层文件:
1 |
|
默认express应用的监听端口是3000,这里使用npm start app.js
来启动我们的应用,其本质就是调用了bin目录下的www脚本,其实还是node调用,只不过定义了端口等信息。然后访问网页就可以看到内容了(304是因为我访问过了):
-基于NodeJS的Web框架/image-20210714171804025.png)
静态资源注册
比如图片这些东西直接使用express自带的static函数就可以注册了,例子如下:
1 | app.use(express.static('public')) |
上面的代码就把public目录下的所有静态资源都开放给外界使用,比如http://localhost:3000/css/style.css
就可以被访问到。如果你还有其他目录的资源想要开放,那么也是使用上面的函数进行注册就可以了。
此外,你也可以将资源挂在到一个虚拟的路径下面,比如:
1 | app.use('/static', express.static('public')) |
那么上面那个css文件的访问路径就变成了http://localhost:3000/static/css/style.css
。上面这种注册方式是因为你的注册语句是写在app.js里面的,如果说你写到其他文件里,express是找不到这个public文件夹的,所以建议这样注册,其中__dirname
就是你的项目根目录。
1 | app.use('/static', express.static(path.join(__dirname, 'public'))) |
参考学习
Express - 基于 Node.js 平台的 web 应用开发框架 - Express 中文文档 | Express 中文网 (expressjs.com.cn)