2014-10-02 87 views
1

我在[Express的路徑處理方法]中遇到問題,特別是Post函數。
http://expressjs.com/api.html#app.VERBExpress Post函數中回調的執行順序

我試圖從this passport example

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }), 
    function(req, res) { 
    res.redirect('/'); 
}); 

通過一段代碼來解析快遞文件說

多個回調給出,所有都一視同仁,表現得像中間件。

我的問題是,是下面的語句是準確的:

中間件就像是連接在一起的一堆管子。首先介紹的中間件是首先列出的中間件。如果數據是水,它將流過首先列出的管道。

路由處理方法中的回調也是如此:回調是管道連接在一起的,如果通過這些'管道'倒入數據,則通過列出的第一個回調並依次回調第二個回調。真的嗎?

作爲後續問題,這些回調應該返回什麼?第一個回調是否返回響應,第二個回調接收並將其視爲請求?應該從管道出來,我可以將它粘到第二根管子上嗎?

回答

2

這種情況下回調函數的返回值無關緊要。他們調用next函數(在此特定護照示例中未定義的第三個參數)。當next函數被調用然後按順序下一個中間件被調用,有相同的參數作爲第一個(同一req,同樣res

說你有這樣的代碼

function myFirstMiddleware(req, res, next) {//note the third parameter 
    //you can change req and res objects 
    next(); 
} 

function secondMiddlewareInTheSequence(req, res, next) { 
    //here you get the changes you've done to req and res since they are 
    //the same objects 
    res.end(); 
} 

app.post('/', myFirstMiddleware, secondMiddlewareInTheSequence); 

什麼passport.authenticate確實是內部如果您的請求被正確驗證,請致電next,以便您的中間件通過控制。

根據給定的條件(幾乎是什麼護照),您甚至可能不希望將控制權交給其他中間件,像這樣。

function checkSecret(req, res, next) { 
    if(req.query && req.query.secret === '42') { 
     console.log('you are allowed to pass!'); 
     next(); 
    } else { 
     console.log('you shall not pass!'); 
     res.status(403).end(); 
    } 
} 

如果放在其它的中間件將防止不包含祕密繼續請求之前上述功能!

+1

非常明確的解釋!所以它基本上是相同的請求和響應對象,由不同的中間件一個接一個地調整。好極了!我對發生的事情有一個很好的心理模型! – 2014-10-02 14:36:48

+0

如果你想深入瞭解[authenticate'的護照源代碼](https://github.com/jaredhanson/passport/blob/master/lib/middleware/authenticate.js#L80) – renatoargh 2014-10-02 14:40:52

+0

感謝小費!呃...對我來說有點深刻。 – 2014-10-02 14:43:52