章
目
录
今天来聊聊Express里重要的工具——中间件。好多新手小伙伴刚接触的时候都一头雾水,别怕,看完这篇保证你能整明白!
啥是Express中间件?
咱先来看个简单的Express代码:app.get("/news/:id", (req, res) => {});
这里面的 (req, res) => {}
就是一个Express中间件。简单来说,中间件就是Express处理请求过程中的一个个“小助手”。当有请求进来,并且这个请求的路径能匹配上我们设定的规则(就像上面例子里的/news/:id
),那就会把这个请求交给对应的处理函数,也就是中间件来处理。
打个比方,你去餐厅吃饭,服务员接到你的点餐请求(这就是Express收到的请求),然后把你的请求传递给不同的厨房工作人员(这些工作人员就好比一个个中间件),他们各司其职,最后把做好的饭菜(响应)端给你。
Express中间件实际咋用?看代码示例就懂了!
const express = require("express");
const app = express(); // 创建一个express应用,就好比开了一家餐厅
console.log(process.env.NODE_ENV);
app.get(
"/news",
(req, res, next) => {
// 第一个中间件,打印handler1,然后把请求传递给下一个中间件
console.log("handler1");
next();
},
(req, res, next) => {
// 第二个中间件,打印handler2,接着再传递请求
console.log("handler2");
next();
}
);
app.get("/news", (req, res, next) => {
// 第三个中间件,打印handler3,继续传递请求
console.log("handler3");
next();
});
const port = 5008;
app.listen(port, () => {
console.log(`server listen on ${port}`); // 启动服务器,监听5008端口,就像餐厅开始营业啦
});
在这段代码里,当有请求到达/news
这个路径时,会依次执行这几个中间件。不过有个问题,运行这段代码后,客户端得到的会是404错误。为啥呢?因为最后一个请求处理完之后,没有结束响应,就好比餐厅工作人员一直忙活,但就是不上菜,顾客肯定不干呀,所以服务器就返回404了。
中间件处理的细节
(一)没有后续中间件时的情况
要是中间件处理完请求后,后面没有其他中间件了,而且还没结束响应,Express就会给客户端返回404错误。这就好比餐厅工作人员都忙完手里的活儿了,但就是没人把菜端给顾客,顾客当然收不到东西,只能得到一个“未找到”的提示啦。
(二)中间件出错了咋办?
中间件要是出了错,服务器可不会直接“罢工”。这时候相当于调用了next(错误对象)
,程序会去找后续专门处理错误的中间件。要是找了一圈,发现没有后续的中间件能处理这个错误,那服务器就会给客户端返回500错误,也就是服务器内部错误。这就好比厨房某个工作人员干活出岔子了,要是有其他同事能帮忙解决还好,要是没人能处理,餐厅就只能给顾客说“不好意思,出问题了”。
(三)处理错误的中间件长啥样?咋用?
module.exports = (err, req, res, next) => {
if (err) {
// 如果有错误,把错误信息处理一下
const errObj = err instanceof Error ? err.message : err;
// 返回500状态码,并发送错误信息
res.status(500).send(getMsg.getErr(errObj));
} else {
// 没错误就继续处理下一个中间件
next();
}
};
使用的时候也很简单,用 app.use("/news",require("处理错误的中间件的路径"))
就行。这里的/news
是路径,它能匹配像/news
、/news/abc
、/news/ab/asd
这些路径,但像/n
、/a
、/
、/newsabc
这些就匹配不上啦。而且中间件还能获取到请求的基地址,比如上面例子里的基地址就是/news
,用req.baseUrl
就能获取到。
用中间件处理静态资源请求
有些时候,我们得用中间件来判断请求是要访问API接口还是获取静态资源。看下面这段代码:
module.exports = (req, res, next) => {
if (req.path.startsWith("/api")) {
// 如果请求路径以/api开头,说明是请求API接口,那就交给下一个中间件处理
next();
} else {
// 否则,说明可能是想要静态资源
if (true) {
// 这里简单返回“静态资源”,实际应用中会返回真正的静态资源内容
res.send("静态资源");
} else {
// 不符合条件就继续交给下一个中间件处理
next();
}
}
};
这样一来,我们就能通过中间件对不同类型的请求进行区分处理啦。
Express中间件也就这么回事儿,大家赶紧动手试试,多敲几遍代码,保准能熟练掌握!