运行 服务器和使用浏览器浏览时,Expressjs 路由被调用两次

Expressjs Routes are invoked twice when running server and browsing using browser

当 运行

时,Expressjs 路由被调用两次

OS系统环境:Windows11、ExpressJS ("express": "^4.18.1", "version": "4.18.1"), Node v16.15.0

const url = require('url');
const path = require("path");
const express = require('express');

let app = express();
console.log("instantiation");

app.use("/language", function (req, res) {
    const queryObject = url.parse(req.url, true).query;
    console.log("/ language");
    res.send("Testing server : language");
});

app.use("/", function (req, res) {
    console.log("/ path");
    res.send("Testing server : main page");
});

app.use("*", function (req, res) {
    console.log("* path");
    res.send(`"Testing my server"`);
});

app.listen(3001, "127.0.0.1", function () {
    console.log(`Server listening at ` + 3001);
});

更新(下面的/路由仍然被调用了两次)。有什么我想念的吗?:

const url = require('url');
const path = require("path");
const express = require('express');

let app = express();
console.log("instantiation");

app.use("/language", function (req, res) {
    const queryObject = url.parse(req.url, true).query;
    console.log("/ language");
    res.send("Testing server : language");
});

app.use("/", function (req, res) {
    console.log("/ path");
    res.send("Testing server : main page");
});

app.listen(3001, "127.0.0.1", function () {
    console.log(`Server listening at ` + 3001);
});

是我的系统问题还是 express/node 的真正问题?

您的路由处理程序被多次调用的原因是因为您使用的是 app.use('/') 而不是特定的方法处理程序,例如 app.get('/')app.post('/').

app.use() 用于添加中间件,并将匹配请求路径的 base(与使用方法处理程序相反,它将匹配 完整路径)。

换句话说,app.use('/') 将匹配 任何 尚未被之前声明的其他处理程序处理的请求。这包括对 /favicon.ico 的请求,浏览器通常在打开页面时执行这些请求。它还会将请求匹配到 /foo/bar,例如。

可以找到有关 app.use() 的更多信息 here