首页 > 解决方案 > 使用 express.static('public') 时难以理解中间件的流程

问题描述

我现在正在学习express,我很难理解express中的中间件流程。例如,如果我有以下代码 import express from 'express';

const app = express();

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})

app.use(express.static('public'));


app.listen(1234,()=>{
    console.log("started at port:1234");
});

当我在浏览器中键入 localhost:1234 时,我将在终端中获得以下内容started at port:1234, app.use并在浏览器中获得“hello”。我理解这是因为第一个中间件有 res.send("hello") ,因此它发回 "hello" 而不将 res 传递给 app.use(express.static('public')) (公用文件夹有一个索引.html 在这种情况下未显示)

但是当我稍微修改代码时,我不再了解中间件的流程了

const app = express();

app.use(express.static('public'));

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})


app.listen(1234,()=>{
    console.log("started at port:1234");
});

这次,started at port:1234 app.use app.use app.use当我在浏览器中键入 localhost:1234 时,我将在终端和 index.html 中获得以下内容。首先,我不明白为什么我的浏览器中没有“你好”。我明白app.use(express.static('public'));但是 app.use 是在其中app.use(express.static('public'));有一个 res.send("hello") 之后出现的,因此发回的请求应该是 "hello" 而不是 index.html?其次,为什么终端显示“app.use”不止一次?app.use((req,res,next)=>{console.log("app.use");res.send("hello")})应该只执行一次吗?更不用说它里面有一个 res.send 。谁能给我解释一下?谢谢你的帮助

标签: expressmiddleware

解决方案


中间件定义的顺序很重要,当中间件堆栈中的第一个中间件与请求路径匹配时,它将负责处理请求。

我会举个例子

app.use('/', (req, res, next) => {
    res.send('First middleware');
});
app.use('/', (req, res, next) => {
    res.send('Second middleware');
}

如您所见,两个中间件具有相同的路径。中间件堆栈中的第一个请求处理程序将在请求 URL 时http://localhost:[port_number]/执行,而第二个不会执行。

一般来说,当您在后端导航到任何网站的根路径时,服务器会查找名为 的文件index.html,这是许多 Web 服务器的默认配置。index.html因此,当您导航到 express 应用程序的根路径时,express 提供的所有静态文件所在的目录都包含一个名为的文件,该express.static中间件附加在您的个性化中间件之前,如下所示。

app.use(express.static('public'));

app.use((req,res,next)=>{
    console.log("app.use");
    res.send("hello")
})

index.html目录内的文件public将被呈现,而不是hello.


推荐阅读