Express—Node.js
官网传送门(opens new window)
基于 Node.js 平台,快速、开放、极简的 Web 开发框架
Express 是用于快速创建服务器的第三方模块。
Express 初体验
基本使用
安装 Express:
创建服务器,监听客户端请求,并返回内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| const express = require('express')
const app = express()
app.get('/user', (req, res) => { res.send({ name: 'zs', age: 20, gender: '男' }) }) app.post('/user', (req, res) => { res.send('请求成功') })
app.get('/', (req, res) => { console.log(req.query) res.send(req.query) })
app.get('/user/:ids/:username', (req, res) => { console.log(req.params) res.send(req.params) })
app.listen(80, () => { console.log('express server running at http://127.0.0.1') })
|
托管静态资源
- 通过
express.static() 方法可创建静态资源服务器,向外开放访问静态资源。
- Express 在指定的静态目录中查找文件,并对外提供资源的访问路径,存放静态文件的目录名不会出现在 URL 中
- 访问静态资源时,会根据托管顺序查找文件
- 可为静态资源访问路径添加前缀
1 2 3 4 5 6 7 8 9 10 11 12 13
| app.use(express.static('public')) app.use(express.static('files')) app.use('/bruce', express.static('bruce'))
|
Express 路由
创建路由模块:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const express = require('express')
const router = express.Router()
router.get('/user/list', (req, res) => { res.send('Get user list.') }) router.post('/user/add', (req, res) => { res.send('Add new user.') })
module.exports = router
|
注册路由模块:
1 2 3 4 5 6 7 8 9 10 11
| const express = require('express') const router = require('./router')
const app = express()
app.use('/api', router)
app.listen(80, () => { console.log('http://127.0.0.1') })
|
Express 中间件
- 中间件是指流程的中间处理环节
- 服务器收到请求后,可先调用中间件进行预处理
- 中间件是一个函数,包含
req, res, next 三个参数,next() 参数把流转关系交给下一个中间件或路由
中间件的作用:
多个中间件之间,共享同一份req和res,基于这样的特性,我们可以在上游的中间件中,统一为req或res对象添加自定义属性或方法,供下游的中间件或路由进行使用
中间件注意事项;
- 在注册路由之前注册中间件(错误级别中间件除外)
- 中间件可连续调用多个
- 别忘记调用
next() 函数
next() 函数后别写代码
- 多个中间件共享
req、 res对象

全局中间件
- 通过
app.use() 定义的中间件为全局中间件
- 这时访问其他接口都会调用该中间件
- 定义多个全局中间件时,会按照编写顺序从前往后执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const express = require('express') const app = express()
app.use((req, res, next) => { console.log('调用了第1个全局中间件') next() })
app.use((req, res, next) => { console.log('调用了第2个全局中间件') next() })
app.get('/user', (req, res) => { res.send('User page.') })
app.listen(80, () => { console.log('http://127.0.0.1') })
|
局部中间件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const express = require('express') const app = express()
const mw1 = (req, res, next) => { console.log('调用了第一个局部生效的中间件') next() }
const mw2 = (req, res, next) => { console.log('调用了第二个局部生效的中间件') next() }
app.get('/hello', mw2, mw1, (req, res) => res.send('hello page.')) app.get('/about', [mw1, mw2], (req, res) => res.send('about page.'))
app.get('/user', (req, res) => res.send('User page.'))
app.listen(80, function () { console.log('Express server running at http://127.0.0.1') })
|
中间件分类
1.应用级别的中间件
- 通过
app.use() 或 app.get() 或 app.post() ,绑定到 app 实例上的中间件
2.路由级别的中间件
- 绑定到
express.Router() 实例上的中间件,叫做路由级别的中间件。用法和应用级别中间件没有区别。应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上。
1 2 3 4 5 6 7 8 9
| const app = express() const router = express.Router()
router.use(function (req, res, next) { console.log(1) next() })
app.use('/' router)
|
3.错误级别的中间件
- 用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题
- 错误级别中间件的处理函数中,必须有 4 个形参,形参顺序从前到后分别是
(err, req, res, next) 。
- 错误级别的中间件必须注册在所有路由之后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const express = require('express') const app = express()
app.get('/', (req, res) => { throw new Error('服务器内部发生了错误!') res.send('Home page.') })
app.use((err, req, res, next) => { console.log('发生了错误!' + err.message) res.send('Error:' + err.message) })
app.listen(80, function () { console.log('Express server running at http://127.0.0.1') })
|
4.Express 内置中间件
自 Express 4.16.0 版本开始,Express 内置了 3 个常用的中间件,极大的提高了 Express 项目的开发效率和体验:
express.static 快速托管静态资源的内置中间件,例如: HTML 文件、图片、CSS 样式等(无兼容性)
express.json 解析 JSON 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
express.urlencoded 解析 URL-encoded 格式的请求体数据(有兼容性,仅在 4.16.0+ 版本中可用)
1 2
| app.use(express.json()) app.use(express.urlencoded({ extended: false }))
|