使用express.static'public'时难以理解中间件的流程

问题描述

我现在正在学习表达,并且在理解表达中的中间件流程方面遇到困难。 例如,如果我有以下代码 从“ 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,next)=>{
    console.log("app.use");
    res.send("hello")
})


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

这次,当我在浏览器中键入localhost:1234时,将在终端started at port:1234 app.use app.use app.use和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,next)=>{console.log("app.use");res.send("hello")})仅应执行一次?更不用说它内部有重新发送。 有人可以向我解释一下吗?谢谢您的帮助

解决方法

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

我会举个例子

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

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

通常,当您导航到后端任何网站的根路径时,服务器将查找名为index.html的文件,这是许多Web服务器的默认配置。因此,当您导航到express应用程序的根路径时,express会在其中提供所有静态文件的目录中包含一个名为index.html的文件,其中express.static中间件已附加到您的个性化中间件(如波纹管)之前。 / p>

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

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

将显示index.html目录内的public文件,而不是hello