定义一个中间件
// 导入 express 模块
const express = require('express')
// 创建 web 服务器
const app = express()
// 定义中间件
const mv = function(req, res, next) {
console.log('触发了中间件!')
next()
}
// 全局注册中间件
app.use(mv)
// 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
简化形式
// 导入 express 模块
const express = require('express')
// 创建 web 服务器
const app = express()
// 定义一个全局中间件简化形式
app.use((req, res, next) => {
console.log('这是最简单的中间件函数')
next()
})
// 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
中间件的作用
多个中间件之间,共享同一份 req 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用
// 导入 express 模块
const express = require('express')
// 创建 web 服务器
const app = express()
// 定义一个全局中间件简化形式
app.use((req, res, next) => {
// 获取请求到达服务器的时间
const time = Date.now()
// 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由
req.startTime = time
next()
})
app.get('/', (req, res) => {
res.send('这是首页' + req.startTime)
})
// 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
定义多个中间价
可以使用 app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用
// 导入 express 模块
const express = require('express')
// 创建 web 服务器
const app = express()
// 定义一个全局中间件简化形式
app.use((req, res, next) => {
console.log('第一个中间件')
next()
})
app.use((req, res, next) => {
console.log('第二个中间件')
next()
})
app.get('/', (req, res) => {
res.send('这是首页')
})
// 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
局部生效中间件
不使用 app.use() 定义的中间件,叫做局部生效的中间件
// 导入 express 模块
const express = require('express')
// 创建 web 服务器
const app = express()
// 定义一个中间件
const mw1 = (req, res, next) => {
console.log('调用了局部中间件')
next()
}
// mw1 中间件只在当前路由中生效
app.get('/', mw1, (req, res) => {
res.send('这是首页')
})
app.get('/user', (req, res) => {
res.send('这是用户界面')
})
// 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
调用多个局部中间件
// 导入 express 模块
const express = require('express')
// 创建 web 服务器
const app = express()
// 定义一个中间件
const mw1 = (req, res, next) => {
console.log('调用了第一个局部中间件')
next()
}
const mw2 = (req, res, next) => {
console.log('调用了第二个局部中间件')
next()
}
// mw1, mw2 中间件只在当前路由中生效
// app.get('/', mw1, mw2, (req, res) => {
// res.send('这是首页')
// })
// 当调用多个中间件时,可以将他们写成一个数组的形式
app.get('/', [mw1, mw2], (req, res) => {
res.send('这是首页')
})
app.get('/user', (req, res) => {
res.send('这是用户界面')
})
// 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
评论