node.js中的Express-路由-express中间件( 二 )


为路由模块添加/api访问前缀的方法
app.use('/api',userRouter)
三.中间件 1.什么是中间件
中间件,本质上就是一个处理函数,中间件的格式如下:
app.get('/',function(req,res,next)=>{next();})
中间件的格式与路由相似,区别在于中间件必须包含next参数 。而路由处理函数中只包含req和res.
next函数是实现多个中间件连续调用的关键,表示处理完毕了,且把流转关系转交给下一个中间件或者路由
1.1定义中间件函数
const express = require('express')const app = express()//定义一个最简单的中间件函数const mw = function(req, res, next) {console.log('这是最简单的中间件函数');//把流转关系转交给下一个中间件或路由next();}app.listen(80, () => {console.log('http://127.0.0.1');})
2.全局生效的中间件
客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件
实现方式:调用app.use(中间件函数) 。即可定义一个全局生效的中间件

node.js中的Express-路由-express中间件

文章插图
app.use(mw)app.get('/', (req, res) => {res.send('home page')})app.get('/', (req, res) => {res.send('user page')})
3.中间件的作用
做个中间价之间,共享同一份req和res,基于这样的特性,我们可以在上游的中间件中,统一为req或res对象添加自定义的属性和方法,供下游的中间件或路由使用 。
eg:在中间件中为req挂载属性值,后面的两个路由均能使用
4.定义多个全局中间件
使用app.use()连续定义多个中间件 。客户端请求到达服务器,会按照中间件的定义的前后顺序调用
//定义第一个全局中间件app.use((req, res, next) => {console.log('调用了第一个全局中间件');next();})//定义第二个中间件app.use((req, res, next) => {console.log('调用了第二个全局中间件');next();})app.get('/user', (req, res) => {console.log('调用了/user这个路由');res.send('user page')})
测试结果:
5.局部生效的中间件
局部生效的中间件指的是 **不使用app.use()**定义的中间件,且只在调用的路由中起作用,如下面的代码,终端只响应第一个路由输出的结果
测试结果如下:
6.定义多个局部中间件
调用第一个中间件执行这次请求,接着调用第二个中间件执行这次请求,最后把请求交给路由
7.中间件的使用注意项8.中间件的分类 应用级别的中间件路由级别的中间件错误级别的中间件内置的中间件第三方中间件 8.1.应用级别的中间件
通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做应用级别的中间件 。
8.2.路由级别的中间件
绑定到.实例上的中间件,叫做路由中间件,用法与应用级中间件没区别,应用级中间件只是绑定到app实例上,路由级别中间件绑定到上
8.3.错误级别中间件
专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题 。错误级别中间件的处理函数中,必须有四个形参,(err,req,res,next)
错误路由在前,错误级别中间件在后
app.get('/', (req, res) => {//人为制造的错误throw new Error('服务器内部发生了错误')res.send('user page')})//定义错误级别的中间件,捕获整个项目的异常,防止程序的崩溃app.use((err, req, res, next) => {console.log('发生了错误' + err.message);res.send('Error!' + err.message)})