Express中间件使用详解

前端 潘老师 1个月前 (03-19) 31 ℃ (0) 扫码查看

今天来聊聊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中间件也就这么回事儿,大家赶紧动手试试,多敲几遍代码,保准能熟练掌握!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/front/16038.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】