node.js - 中间件

0x01 什么是中间件?

在默认情况下,当客户端发送请求时,服务器会进行依次到下的匹配,匹配成功就不再向下匹配。


而中间件可以拥有继续向下匹配的权限,这需要在参数中添加一个参数:next

  • next 是一个封装好的方法,它可以控制是否继续向下匹配。

  • 向下匹配的前提是:该中间件没有返回给客户端数据,否则就会报错了。

  • 这就相当于一个生产线,当手机进入第一个工序时,这个工序对它进行加工,加工完成后继续向下流(这就相当于next),如果这个工序检测到了这个产品不合格,那么就不让它流入下一个了。


  • 在下面这个案例中,首先匹配到第一个get。

  • 这个get并没有结束返回,而是调用next()方法继续向下匹配。

  • 然后匹配到第二个get,在同一次请求中,req对象时同一个,然后返回给客户端req对象中的foo属性,执行完毕。

app.get("/admin", function(req, res, next){
    req.foo = "bar";
    next();
});

app.get("/admin", function(req, res, next){
    res.send(req.foo);
});

0x02 app.use() 中间件用法:

在Express框架中,提供了 app.use() 这个方法,这个方法不区分到底是get还是post请求,它会匹配所有请求方式。

  • 它可以传入一个请求地址,然后这个中间件只针对这个请求地址有效。

  • 也可以不传入请求地址,就只写一个回调函数,然后它会不管你是什么请求地址,都会经过这个中间件。

该中间件只针对 /admin 地址有效,然后向下匹配第二个中间件。

app.use("/admin", function(req, res, next){
    //处理内容
    next();//向下匹配
});

该中间价不管是什么请求,都会经过这里。

app.use(function(req, res, next){
    //处理函数
    next();
});

0x03 错误处理中间件:

在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败,错误处理中间件是一个集中处理错误的地方。

  • 它一共有四个参数:err、req、res、next
app.use(function(err, req, res, next){
    res.status(500).send("服务器发生未知错误:", err.message);
})
//当发生错误时,会执行这个错误处理中间件。

错误处理中间件只能捕获到同步代码出错( throw new Erroe(“错误信息”) )。

如果在异步代码中出现了错误,这时需要手动触发错误处理中间件,这时调用 next() 方法并且将错误信息当作参数即可。

app.get("/index", function (req, res, next) {
    throw new Error("出现错误了.");
    next("出现错误了.");
    // 同步代码可以手动抛出一个异常让错误处理中间件来捕获,也可以手动调用next()。
})


app.get("/index", function (req, res, next) {
    fs.readFile("./a.txt", "utf8", function(err, data){
        if(err){
            next(err);
            //在异步代码中只能通过next()来调用错误处理中间件。
        }
    })
})

注意:错误处理中间件一般写在最后面。


发表评论 / Comment

用心评论~