中间件

144 阅读2分钟

中间件的概念

1,中间件本质上是一个函数,接收request,和response对象,会对每一个匹配的请求进行处理

let express = require('express');
let app=new express();
app.use(function(res,req,next) {
    console.log("这是第一个中间件");
    next();
});
app.use(function(res,req,next) {
    console.log("这是第二个中间件");
    next();
});
app.use(function(res,req,next) {
    console.log("这是第三个中间件");
    next();
})
app.get('/', function(res,req,next) {
    console.log("这是特殊的中间件");
    req.send("get请求")
})
app.listen(3000,function() {
    console.log("服务器启动成功")
})

当请求路径为:http://localhost:3000/
返回结果:
服务器启动成功
这是第一个中间件
这是第二个中间件
这是第三个中间件
这是特殊的中间件

当发出请求http://localhost:3000/的时候,服务器会接受到请求,然后找到第一个中间件进行执行,当第一个中间件执行完毕之后,会调用next(),next会调用继续找中间件,如果请求匹配,则会执行找到的中间件,依次类推,直到所有的中间件都执行完毕,注意next()执行之后不是去找下一个中间件进行执行,而是找下一个匹配的中间件进行执行,如果一个中间件执行完毕,而没有调用next(),则后面所有的中间件,无论匹配或者不匹配,都不会再去执行。

中间件分类

应用程序级别的的中间件

应用程序级别的中间件可以处理任意请求路径或者是以指定的第一个参数开头的路径

app.use(function(res,req,next) {
    console.log("这是第三个中间件");
    next();
})
app.use('/',function(res,req,next) {
    console.log("这是第三个中间件");
    next();
})

路由级别的中间件

对请求路径有严格的要求,符合要求的请求才能匹配到这个中间件,当请求url为/a的时候,只会匹配第一个参数为/a的中间件,其他包括/a的则不会被匹配到。

app.get('/a/b',function(res,req){
    console.log("/a/b");
})
app.get('/a',function(res,req){
    console.log("/a");
})

错误处理级别的中间件

错误处理中间件的处理函数有四个参数,不能定义三个参数,如果定义三个参数,则第一个就是res,第二个就是req,第三个就是next,就得不到错误对象

let express = require('express');
let fs = require('fs');
let app=new express();

app.use('/a',function(res,req,next){
    console.log("这是一个a请求")
    fs.readFile('./a.html',function(error,data){
        if(error){
            next(error)
        }
    })
})
app.use('/b',function(res,req,next){
    fs.readFile('./b.html',function(error,data){
        if(error){
            next(error)
        }
    })
})
app.use('/c',function(res,req,next){
    fs.readFile('./c.html',function(error,data){
        if(error){
            next(error)
        }
    })
})
app.use(function(error,res,req,next){
    req.send('404.request no find')
})

app.listen(3000,function() {
    console.log("服务器启动成功")
})

当请求路径为/a,/b或者/c的时候,页面都是出现相同的错误信息404.request no find这就是错误处理插件的简单定义与使用,当请求中有err的时候,将err对象传到next函数中,next会调用定义了四个参数的中间件,然后中间件函数会对错误进行统一处理。