什么是中间件 :
app.get("/news/:id", (req, res) => {});
中的(req,res)=>{}
就是一个express中间件
当匹配到请求后,交给第一个处理函数来处理(给第三个参数next)
js
const express = require("express");
const app = express(); // 创建一个express应用
console.log(process.env.NODE_ENV);
app.get(
"/news",
(req, res, next) => {
console.log("handler1");
next();
},
(req, res, next) => {
console.log("handler2");
next();
}
);
app.get("/news", (req, res, next) => {
console.log("handler3");
next();
});
const port = 5008;
app.listen(port, () => {
console.log(`server listen on ${port}`);
});
但是客户端得到的会是404:因为在上边的代码中,最后一个请求之后没有请求了,但是后边也没有end,所有服务器响应没有结束会返回404
- 中间件处理的细节
- 如果后续没有了中间件,express发现如果没有结束,会响应404
- 如果中间件发生了错误,不会停止服务器,相当于调用了next(错误对象),寻找后续的错误处理中间件,如果没有后续的中间件,服务器会响应500。
处理错误的中间件:
js
module.exports = (err, req, res, next) => {
if (err) {
const errObj = {
code: 500,
msg: err instanceof Error ? err.message : err,
};
// 发生了错误
res.status(500).send(errObj);
} else {
next();
}
};
使用 :app.use("/news",require("处理错误的中间件的路径"))
可以匹配: /news 、/news/abc、 /news/ab/asd
不能匹配:/n、/a、/、/newsabc
中间件可以获取到请求的基地址req.baseUrl
比如上边例子的基地址为/news
- 给静态资源
js
module.exports = (req, res, next) => {
if (req.path.startsWith("/api")) {
// 说明你请求的是 api 接口
next();
} else {
// 说明你想要的是静态资源
if (true) {
res.send("静态资源");
} else {
next();
}
}
};