Express中间件被多次调用

时间:2019-05-14 17:02:10

标签: javascript node.js express middleware

我的中间件被多次调用,我不知道为什么。 这是一个非常短的代码,当我刚开始学习Express和Node时,这非常令人沮丧。 我不明白为什么它甚至进入第二种中间件,我没有使用next(),而是使用res.send()

我正在上在线课程,它的代码与描述的相同。我也搜索了stackoverflow,但没有任何帮助。 我确实读过一些有关favicon的信息,但第二次却被调用,但我不知道为什么会多次调用它。

const express = require("express");
const app = express();

app.use("/", (req, res, next) => {
    console.log("This always runs!");
    next();
});

app.use("/add-product", (req, res, next) => {
    console.log("In first middleware!");
    res.send("<h1>Add Product</h1>");
});

app.use("/", (req, res, next) => {
    console.log("In second middleware!");
    res.send("<h1>Hello from express!</h1>");
});

app.listen(3000);

如果我打开localhost:3000/add-product,我应该进入控制台:

This always runs!
In first middleware!

但是我实际上得到了:

This always runs!
In first middleware!
This always runs!
In second middleware!
This always runs!
In first middleware!

favicon是否可以一次自动执行所有中间件?我在第一次app.use()调用之前添加了以下代码:

app.get("/favicon.ico", (req, res) => res.status(204));

现在我得到

This always runs!
In first middleware!
This always runs!
In first Middleware!

我还是两次。

编辑编辑编辑:

这似乎仅在Chrome中发生。

3 个答案:

答案 0 :(得分:1)

对于要使用路由器的主要用于中间件注册的路由,请不要使用app.usehttps://expressjs.com/en/4x/api.html#app.use

app.(post|get|delete|put)("route", function(req,res,next){})

根据您的情况,最好查看您的浏览器是否正在请求2个http呼叫。如果是这样,它将翻倍。

答案 1 :(得分:0)

问题已解决:我重新安装了Chrome,现在可以正常使用了。谢谢大家!

答案 2 :(得分:0)

浏览器正在发送对网站图标的请求。在 chrome 上按 F12,您将看到正在发出两个请求。其中之一将是本地主机,另一个将是 favicon.ico。因此,您会看到两套 console.log() 被打印到控制台。

enter image description here

您可以右键单击 favicon.ico 并单击阻止请求 URL 以阻止浏览器发送对 favicon.ico 的请求,而不是重新安装 chrome