【问题标题】:ExpressJS middleware is being called twiceExpressJS 中间件被调用两次
【发布时间】:2021-04-27 13:17:22
【问题描述】:

在下面的代码中,如果我把它作为app.use() 的第一个参数,middleware logger() 会被调用两次,但如果作为第二个参数,它根本不会被调用。

有人能解释一下发生了什么吗?

const express = require('express');
const app = express();
const path = require('path');

app.use(express.static(path.join(__dirname,'public')), logger);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server started on port ${PORT}`));

function logger(req, res, next) {
  console.log("logger, then next");
  next();
}

【问题讨论】:

  • 只需为每个请求记录req.urlin logger(),一切都会变得清晰。

标签: javascript node.js express server middleware


【解决方案1】:

如果我将中间件 logger() 作为 app.use() 的第一个参数,它会被调用两次
发生这种情况是因为浏览器正在请求两个文件。第一个将用于 /,第二个可能用于 favicon.ico。如果您想了解为什么调用它,请将您的一个函数更改为如下所示:

function logger(req, res, next) {
  console.log('This is middleware', req.originalUrl);
  next();
}

然后它会输出每次浏览器访问服务器时请求的 URL。

如果作为第二个参数,它根本不会被调用
由于 express 到达 logger 中间件时请求已经被服务,所以中间件的顺序在 express 中非常重要。

【讨论】:

  • 哦,是的,它实际上是在请求我链接到 html 的 CSS 文件。因此,服务器实际上收到了两个请求,每个请求都调用 logger。谢谢
猜你喜欢
  • 2018-01-16
  • 2020-09-23
  • 2021-09-16
  • 2022-01-19
  • 2021-12-07
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多