开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
中间件是什么
中间件是介于应用系统和系统软件之间的一类软件,它使用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。
为什么要有中间件
在我们的日常开发中,在一个文件中写入过多代码,对于代码的维护非常的不友好,所以node引入了中间件的概念,让程序员写的代码更容易维护
Express 中间件的格式
客户端发送的请求会经过中间件然后通过 next()传递给下一个中间件或路由
const express = require('express')
const app = express()
// 定义一个中间件
const mw = function(req, res, next) {
console.log('这是最简单的中间件函数')
next()
}
//将mw注册为全局中间件
app.use(mw)
app.get('/', (req, res) => {
res.send('home')
next()
})
app.get('/user', (req, res) => {
res.send('home_2')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
简化形式
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('这是最简单的中间件函数')
next()
})
app.get('/', (req, res) => {
console.log('这是/路由')
res.send('home')
})
app.get('/user', (req, res) => {
console.log('这是/user路由')
res.send('home_2')
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
中间件的作用
可以传递值 在上游写入的值可以在下游获取到
const express = require('express')
const app = express()
app.use((req, res, next) => {
//获取请求到达服务器的事件
const time = Date.now()
//为req对象,挂载自定义属性,从而把时间共享给后面的所有路由
req.starTime = time
next()
})
app.use((req, res, next) => {
next()
})
app.get('/', (req, res) => {
//上游传递的time 在这里可以轻松接取到
res.send('home' + req.starTime)
})
app.get('/user', (req, res) => {
res.send('home_2' + req.starTime)
})
app.listen(80, () => {
console.log('http://127.0.0.1')
})
局部中间件
不使用
app.use()定义的中间件,叫做局部生效的中间件
//导入express
const express = require('express')
//创建web服务器
const app = express()
const mw1 = (req, res, next) => {
console.log('1')
next()
}
app.get('/', mw1, (req, res) => {
res.send('home page.')
})
app.get('/user', (req, res) => {
console.log('bbb')
res.send('user page.')
})
//调用app.listen(80,启动成功后的回调函数),启动服务器
app.listen(80, () => {
console.log('express')
})
定义多个局部中间件
有两种等价的方式,使用多个局部中间件:
app.get('/',mw1,mw2,(req,res)=>{res.send('home page')})
app.get('/',[mw1,mw2],(req,res)=>{res.send('home page')})
中间件的使用注意事项
- 中间件要放在路由的前面
- 客户端发送过来的请求,可以连续调用多个中间件
- 中间件中一定要调用
next()函数 - 防止代码混乱,调用
next()函数后不要再写任何代码 - 连续调用多个中间件时,多个中间件之间,共享req和res对象
在 Node 中,没有全局作用域,只有模块作用域