中间件的概念与格式

83 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 中,没有全局作用域,只有模块作用域