表示浏览器发出请求时两次调用的中间件函数

时间:2019-09-22 04:02:08

标签: node.js express

下面是我的nodejs代码

const express = require('express');

const app = express();

app.use('/', (req, res, next) => {
    console.log("In interceptor");
    next();
});

app.use('/users', (req, res, next) => {
    console.log('In /users middleware');
    res.send('<h1>From "/users" handler </h1>');
});

app.use('/', (req, res, next) => {
    console.log("Default handler");
    res.send('<h1>From default handler</h1>');
});

app.listen(3000);

从浏览器(Chrome和Edge)发出请求时控制台输出

http://localhost:3000
******************
In interceptor
Default handler
In interceptor
Default handler
******************

http://localhost:3000/users
******************
In interceptor
In /users middleware
In interceptor
Default handler
******************

但是当使用curl发出请求时,我看不到多次调用

curl http://localhost:3000
******************
In interceptor
Default handler
******************

curl http://localhost:3000/users
******************
In interceptor
In /users middleware
******************

有人可以解释为什么从浏览器发出请求时多次调用中间件功能吗?

2 个答案:

答案 0 :(得分:1)

从浏览器加载页面时看到多个请求的通常原因是以下两点之一:

  1. 浏览器会自动请求favicon.ico文件。
  2. 浏览器试图从HTML文件(脚本文件,图像,CSS文件等)中加载某些资源

通过添加以下内容,您可以确切地看到每个请求的目的:

console.log(req.url);

到您的中间件。

答案 1 :(得分:0)

发现它是由于浏览器发出的/favicon.ico请求而发生的。添加特定的处理程序(如下所示)可防止两次调用默认处理程序

app.use('/favicon.ico', (req, res, next) => {
    console.log('favicon handler');
    res.sendStatus(200);
});