一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
中间件的分类
Express 官方把常见的中间件用法,分成了五大类
- 应用级别 的中间件
- 路由级别 的中间件
- 错误级别 的中间件
- Express 内置的中间件
- 第三方 的中间件
应用级别的中间件
通过 app.use() 或 app.get() 或 app.post() ,绑定到 app 实例上的中间件,叫做应用级别的中间件。
// 应用级别的中间件(全局)
app.use((req, res, next) => {
next()
})
// 应用级别的中间件(局部)
app.get('/', mw1, (req, res) => {
res.send('home page')
})
路由级别的中间件
绑定到 express.Router() 实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别,只不过,应用级别中间件是绑定到 app 实例上,路由级别中间件绑定到 router 实例上
var app = express()
var router = express.Router()
//路由级别的中间件
router.use(function(req, res, next) {
next()
})
app.use('/',router)
错误级别的中间件
-
错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题
-
格式:错误级别中间的 function 处理函数中,必须有4个形参,形参顺序从前到后,分别是
(err, req, res, next) -
注意:错误级别的中间件必须注册在所有路由之后
-
示例
const express = require('express') const app = express() // 路由 app.get(`/`, function(req, res) { // 抛开一个自定义的错误 throw new Error('服务器内部发生了错误') res.send(`Home page`) }) // 错误级别的中间件 app.use(function(err, req, res, next) { // 在服务器打印错误消息 console.log('发生了错误' + err.message) // 向客户端响应错误相关的内容 res.send(`Error` + err.message) }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') })log
Express 内置的中间件
自 Express 4.16.0 版本开始,Express 内置了3个常用的中间件,极大提高了 Express 项目的开发效率
-
express.static快速托管静态资源的内置中间件,如 HTML 文件、图片、CSS样式 等 -
express.json解析 JSON 格式的请求体数据(仅在4.16.0+ 版本中可用)// 配置解析, application/json 格式数据的内置中间件 app.use(express.json()) -
express.urlencoded解析 URL-encoded 格式的请求体数据(仅在4.16.0+ 版本中可用)// 配置解析, application/x-www-form-lencoded 格式数据的内置中间件 app.use(express.urlencoded({extended: false})) -
示例
-
通过
express.json()解析请求体数据const express = require('express') const app = express() // 除了错误级别的中间件,其他中间件,必须在路由之前进行配置 // 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据 app.use(express.json()) app.post('/user', (req, res) => { //在服务器,使用 req.body 这个属性,来获取 JSON 格式的数据 //默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined console.log(req.body) res.send('ok') }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') })log:
-
通过
express.urlencoded()解析请求体数据const express = require('express') const app = express() // 除了错误级别的中间件,其他中间件,必须在路由之前进行配置 // 通过 express.urlencoded() 这个中间件,解析表单中的 url-encoded 格式的数据 app.use(express.urlencoded({extended: false})) app.post('/user', (req, res) => { //在服务器,使用 req.body 这个属性,来获取 url-encoded 格式的数据 //默认情况下,如果不配置解析 url-encoded 格式数据的中间件,则 req.body 默认等于 {} 空对象 console.log(req.body) res.send('ok') }) app.listen(80, ()=> { console.log('express 服务器运行在 http://127.0.0.1.80') })log:
-
第三方 的中间件
-
非 Express 官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件,在项目中,可以按需下载并配置第三方中间件,从而提高开发效率
-
例如,在 express@4.16.0 之前的版本中,经常用
body-parser这个第三方中间件来解析请求体数据,步骤如下- 运行
npm install body-parser - 使用
require导入中间件 - 调用
aa.use()注册并使用中间件
- 运行
-
示例
const express = require('express')
const app = express()
// 导入解析表单的第三方中间件
const parser = require('body-parser')
// 使用 app.use() 注册三方中间件
app.use(parser.urlencoded({urlencoded: false}))
app.post('/user', (req, res) => {
console.log(req.body)
res.send('ok')
})
app.listen(80, ()=> {
console.log('express 服务器运行在 http://127.0.0.1.80')
})
log: