自定义的中间件,无缘无故执行了多次~~Nodejs求解

自定义的中间件,无缘无故执行了多次~~Nodejs求解

在routes(app);的前面加了一个自己定义的中间件

app.use(auth_user); routes(app);

在执行过程中,auth_user执行了4次,实在搞不懂 感觉像返回next( )的原因,但是是在找不到解决方法

这是代码结构 auth_user = function (req, res, next) { … return next( ); } 估计应该是返回next的原因,但也不至于4次啊

4 回复

在Node.js中使用Express框架时,如果自定义的中间件执行了多次,可能是因为路由配置不当或者中间件被重复注册。以下是一些可能的原因和解决方案。

原因分析

  1. 中间件被重复注册
    • 如果auth_user中间件在多个地方被注册,那么每次请求都会触发多次。
  2. 路由配置问题
    • 路由配置不当也可能导致中间件被多次调用。
  3. 中间件内部逻辑问题
    • 中间件内部逻辑错误可能导致不必要的多次调用。

解决方案

示例代码

假设你的代码结构如下:

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

// 自定义中间件
const auth_user = function (req, res, next) {
    console.log("Auth user middleware executed");
    next();
}

// 注册中间件
app.use(auth_user);

// 路由
function routes(app) {
    app.get('/', (req, res) => {
        res.send('Hello World!');
    });
}

// 调用路由
routes(app);

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

检查点

  1. 确保中间件只注册一次

    • 确保app.use(auth_user)只被调用一次。
  2. 检查路由配置

    • 确保没有重复定义路由或中间件。
  3. 调试输出

    • 在中间件中添加一些调试输出,以确认它是否被多次调用。

进一步排查

如果你仍然遇到问题,可以尝试以下步骤:

  1. 检查全局中间件

    • 确保没有在其他地方重复注册auth_user中间件。
  2. 使用路由前缀

    • 如果你有多个中间件,可以考虑使用路由前缀来限制中间件的作用范围。

例如:

app.use('/api', auth_user);

这样只有匹配/api路径的请求才会触发auth_user中间件。

通过以上步骤,你应该能够找到并解决中间件多次执行的问题。


是不是放在静态文件中间件前面了, 所以导致请求静态文件的时候也在执行这个中间件… 或者看下每次执行时的 req.originalUrl 是啥,这样可以判断是不是同一次请求多次执行

果然是请求静态文件的时候执行了多次~~~ 我把这个中间件放在routes(app);的前面, 之前我把静态文件和错误日志中间件放在一起了,而错误日志必须放在routes(app)的后面,所以连带着静态文件写也放在在routes(app);后面了

一怒之下把静态文件这个写在了最前面~~~也不分生产和开发模式了

对了,请教一个问题,是不是请求静态文件的时候所有中间件都会匹配一次,所以导致了我自己写的执行了多次?

根据你的描述,auth_user 中间件被多次调用。这种情况通常是因为中间件被注册了多次。你可以检查一下是否有重复的 app.use(auth_user) 调用。

另外,如果你使用的是 Express 框架,确保在定义路由之前只注册一次中间件。下面是一个简单的示例,展示了如何正确地添加和使用中间件:

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

// 自定义中间件
const auth_user = function (req, res, next) {
    console.log("Auth middleware executed");
    next();
}

// 只注册一次中间件
app.use(auth_user);

// 定义路由
function routes(app) {
    app.get('/', (req, res) => {
        res.send('Hello World!');
    });
}

routes(app);

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

在这个示例中,auth_user 中间件只会被调用一次。如果问题仍然存在,请检查你的代码是否有其他地方重复注册了 auth_user 中间件。例如,可能是在模块加载时无意中引入了两次。

如果需要进一步排查,可以检查是否在其他文件或模块中重复引入了 auth_user 函数。

回到顶部