app.use(express.static( "public" )) 是否为每个请求调用中间件?



是否使用app.use(express.static("public"))为每个请求调用中间件,即使它不是对静态资源的请求?

只有在路由尚未处理请求时才会调用它。

请记住,路线是按照注册顺序进行测试的,举个例子:

const express = require('express');
const app = express();
const port = 3000;
app.get('/foo', (req, res) => {
console.log('Foo!');
res.send('Foo!');
});
app.use(function (req, res, next) {
console.log('middleware triggered');
next();
});
app.get('/bar', (req, res) => {
console.log('Bar!');
res.send('Bar!');
});
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
});

如果我请求http://localhost:3000/foo,则服务器将记录:

Foo!

/foo端点匹配该请求,然后调用res.send()

如果我请求http://localhost:3000/bar,那么它会记录:

middleware triggered
Bar!

中间件启动(因为它与路由匹配(,称为next()以转到与路由匹配的下一个函数,然后调用/bar处理程序。


仔细定位static中间件非常重要。

如果你把它放在你想匹配请求的路线之前,那么有两种可能的负面影响:

  • 你会在不需要的时候调用它,这是低效的
  • 静态文件将匹配路由,而不是实际的路由处理程序

另一方面,如果你把它放在最后,那么你就会解决效率问题,但一些糟糕的路由设计可能意味着某个东西会创建一个与现有静态文件匹配的URL并屏蔽它。

最好指定一个您知道永远不会与路由冲突的目录(例如app.use('/static', express.static('public'));(,以避免这种可能性。作为奖励,这意味着任何断开的链接(通常为404(都不必通过静态中间件,除非链接首先指向/static路径。

当像这样注册它时,中间件将在每个请求上运行,是的。基本上是因为该语句实际上与相同

app.use("/", express.static("public"))

调用express.static会返回一个经典的中间件函数,该函数将在app.use中指定的每个路径上运行。如果你只想让它在特定的路径上启动,你可以这样注册:

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

最新更新