【问题标题】:Express middleware getting called many timesExpress 中间件被多次调用
【发布时间】:2017-06-22 09:16:25
【问题描述】:
app.use(function(req, res, next) {
    var chatlog = [];
    console.log('executed many timews why?')   
 var chatlog = redisClient.lrange('messages', 0, 99, function(err, reply) {
        if (!err) {
            var result = [];
            for (var msg in reply) result.push(JSON.parse(reply[msg]));
            if (result.length == 0) { 
                result.push({
                    "msg": 'welcome',
                    "nickname": "guest1"
                })
            }
            console.log(result)
        } else {
            console.log('error getting chat messages')
        }
        res.locals = {
            chatlog: result
        };
        next();
        return
    });

  app.get('/', (req, res) => {
 res.render('index', {     })
  })

当我访问 '/' 一次时,控制台会打印以下内容:

executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
executed many timews why
executed many timews why
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]
[ { msg: 'welcome', nickname: 'guest1' } ]
executed many timews why
[ { msg: 'welcome', nickname: 'guest1' } ]

如何让我的中间件只执行一次?如果我拿走next,它只运行一次但页面不会加载,如果我保留next(),它会执行很多次。

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    您的中间件已设置为针对每个请求进行调用。这意味着如果 Express 配置不正确,它将为您碰巧在索引模板中使用的每个图像、样式表或 JS 文件调用。

    如果这些文件由express.static 提供,请确保在express.static 声明之后加载您的中间件:

    app.use(express.static(...));
    
    app.use(...your middleware...);
    
    app.get('/', ...);
    

    这样,您的中间件将不会被调用以获取静态资源,因为express.static 将在您的中间件之前处理它们。

    您也可以创建一个单独的中间件函数并将其插入到特定的路由中:

    let myMiddleware = function(req, res, next) {
      ...
    });
    
    app.get('/', myMiddleware, function(req, res) {
      res.render('index', {})
    });
    

    【讨论】:

    • 这很有意义并解决了我的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 2016-04-08
    • 2013-07-04
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多