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()来调用错误处理中间件。 } }) })
注意:错误处理中间件一般写在最后面。
版权声明:《 node.js - 中间件 》为甄雨锋原创文章,转载请注明出处!
最后编辑:2021-8-17 17:08:29