2017-06-22 26 views
2
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(),它會執行很多次。

回答

3

您的中間件設置爲爲每個請求調用。這意味着,如果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', {}) 
}); 
+0

謝謝。現在它工作正常。 – needitohelp

+0

這使得很多的意義,並解決了我的問題。謝謝! –