快速中间件被多次调用 [英] Express middleware getting called many times

查看:90
本文介绍了快速中间件被多次调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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', {     })
  })

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

When I visit '/' once, console prints the following:

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(),它将执行很多次.

How can I make my middleware to execute only once? If I take away next, it runs only once but page won't load, and if I keep next(), it executes many times.

推荐答案

您的中间件已设置为可以为每个请求调用.这意味着使用错误配置的Express,将为您恰好在索引模板中使用的每个图像,样式表或JS文件调用该文件.

Your middleware is set up to get called for each request. This means that with an incorrectly configured Express, it will get called for each image-, stylesheet- or JS-file that you happen to be using in your index template.

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

If those files are served by express.static, make sure that your middleware gets loaded after the express.static declaration:

app.use(express.static(...));

app.use(...your middleware...);

app.get('/', ...);

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

This way, your middleware won't be called for the static resources because express.static will handle them before your middleware.

您还可以创建一个单独的中间件 function 并将其插入特定的路由:

You can also create a separate middleware function and insert it into specific routes:

let myMiddleware = function(req, res, next) {
  ...
});

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

这篇关于快速中间件被多次调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆