2013-03-14 49 views
1

我正在通過Express.js中間件上的集成測試來驅動行爲。我遇到了一個有趣的情況,即應用程序後面的行爲是不可預測的(不是由我來決定)。在Express.js中重定向後調用下一個中間件

作爲簡化實例:

var middlewareExample = function(req, res, next){ 
    if(req.session){ 
    refreshSession(req.session, function(err, data){ 
     if(!err){ 
     res.redirect('/error'); 
     } 
    }); 
    next(); 
    }else{ 
    res.redirect('/authenticate'); 
    } 
}; 

的問題是重定向下列調用next,因爲它住內部函數和條件以外。我不確定Express如何處理nextres.redirect的中間件/路由調用,如果它們恰好發生在彼此之前或之後,如上所示。

手動測試沒有發現任何奇怪的行爲,也沒有超類模塊。我想知道Express是否以及如何迴應這種情況。另外,supertest可以用來揭露任何潛在的不良行爲。另外,如果可能的話,我想聽聽別人用什麼方法來測試Node/Express中間件。

+0

你想要做什麼? 'res.redirect('/ error')'和'next()'可以在同一個請求中調用,從而搞亂了整個控制流。 – 2013-03-14 06:16:08

+1

如果我嘗試使用這兩種方法,我得到'發送錯誤後無法設置標頭'錯誤。 – robertklep 2013-03-14 06:17:45

+0

@JonathanOng我試圖通過測試來揭示當兩個函數被允許在同一請求中調用時應該發生的任何破壞。 – jneander 2013-03-14 14:39:50

回答

3

您在同一個請求中發送兩個響應。 next()是一個響應,假設下一個處理程序也有響應,所以是res.redirect()。你真正想要的是:

var middlewareExample = function(req, res, next){ 
    if(req.session){ 
    refreshSession(req.session, next); 
    }else{ 
    res.redirect('/authenticate'); 
    } 
}; 
相關問題