带有express的Node.js:为什么我的中间件执行两次这是代码

时间:2018-11-30 12:03:21

标签: javascript node.js express middleware

这是我的代码在这里..

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

let myFunc = function (req, res, next) {
    console.log('This is middleware');
    next();
}

app.use(myFunc);

app.get('/', (req, res) => {
    console.log('This is get /');
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.log('Server is running at port 3000....');
});

在此过程中,我创建了一个名为myFunc的中间件,但输出结果并非我想的那样

Server is running at port 3000....
This is middleware
This is get /
This is middleware

5 个答案:

答案 0 :(得分:2)

每次触发应用程序时,

app.use都会运行。在这种情况下,您触发两次。 app.get和app.listen

答案 1 :(得分:1)

  

正如@DavidWhite所说,每次触发应用程序时app.use都在运行。在这   如果您触发两次。 app.get和app.listen    您应该以这种方式使用中间件

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

let myFunc = function (req, res, next) {
    console.log('This is middleware');
    next();
}

app.get('/', myFunc,(req, res) => {
    console.log('This is get /');
    res.send('Hello World!');
});

app.listen(3000, () => {
    console.log('Server is running at port 3000....');
});

答案 2 :(得分:1)

发生这种情况是因为浏览器正在请求两个文件。第一个用于/,第二个可能用于favicon.ico。如果要查看为什么为什么被调用,请将您的一个函数更改为如下所示:

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

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

答案 3 :(得分:0)

使用app.use(myFunc);时,会将中间件应用于所有应用程序。 您正在使用app.get和app.listen,这就是中间件触发两次的原因。尝试在获取查询中使用Middlewere

答案 4 :(得分:-1)

您的静态文件还与您尝试使用的URL共享相同的URL。 因此,您很可能会遇到以下情况: 本地主机:3000 /:变量

此网址将匹配很多内容