2012-01-30 42 views
1

我開始下的NodeJS/Express和我面臨着以下問題(我可能沒有得到異步編程但所有的招數)快遞/ Node.js的中間件提高誤差,保持加工

我「已經成爲帶如果組oauth_token paramters傳遞檢查的中間件(其實我的節點服務器上實現的OAuth層)

我這樣做:

function myMiddle(req,res,next) { 
    var oAuthToken = req.query["oauth_token"]; 
    if (oAuthToken == undefined) { 
      res.send(406); 
      res.end(); 
    next(new Error('No token provided')); 
} 
/* Basically doing some DB stuff with MongoDB, connecting and using oAuthToken provided to query, etc.. */ 

的事情是,我所期望的代碼當他沒有收到oauth_token參數時「死亡」請求參數。它實際上引發了一個錯誤,並且向我的HTTP客戶端返回了大量的錯誤,但是代碼一直在處理後面,並且引發了由我的處理代碼導致的可變標頭錯誤,並且我的腳本消失了。

我失蹤的東西?感謝提前。

回答

2

如果您oAuthToken是不確定的Node.js使得響應。後你需要啓動next(...),它試圖對同一個請求做出另一個響應,但是這種方式失敗了,你會發現你看到了什麼,請注意,在Node.js中,使用res.send();res.end();不會停止你的函數,所以你需要做的是:

function myMiddle(req,res,next) { 
    var oAuthToken = req.query["oauth_token"]; 
    if (oAuthToken == undefined) { 
    next(new Error('No token provided')); // handle everything here 

    // res.send(406); 
    // res.end(); 
    // unnecessary, throws errors because you try to respond twice 
    } 
    // do something if this is fine 
} 

或以其他方式執行 - 使用res.send(406); res.end();而不使用next(...)

+0

我試過,並且代碼不斷處理。就像我在下面的評論中所說的,我通過返回下一個('error')來修正它,而不是僅僅調用它。這對你來說似乎是邏輯嗎? – spacenick 2012-01-30 15:26:12

+0

它沒有。 :D實際上它的確如此,它只意味着在調用'next()'之後強制函數停止工作。也許你應該修改一下我的代碼並使用'if {...} else {...}'?在next()後面運行什麼(與響應有什麼關係)是非常重要的。這就是我所能說的,祝你好運! – freakish 2012-01-31 09:12:52

0

你在你的中間件堆棧有明確的錯誤處理(app.use(express.errorHandler())

另見Express middleware section關於如何使用next()細節。

+0

呀,我有錯誤處理程序。實際上,我通過返回next('error')而不是僅僅調用next來「解決」(不確定它是否乾淨)。我想它會使感官,因爲它使功能退出 – spacenick 2012-01-30 15:02:42

1

這可能會很晚,但我也遇到了這個問題。您實際上可以將錯誤傳遞給ErrorHandler,以便中間件不會繼續到下一個中​​間件或路由器,而您可以發送所需的HTTP狀態代碼。

中間件

function myMiddle(req, res, next) { 
    // Do validate your OAuth token 
    // you might want to do better validation of the token here 
    // instead of just checking its existence 
    // 
    // var oAuthToken = req.query['oauth_token']; 
    // 
    // According to JSLint, you can just directly select the object as: 
    // 
    // req.query.oauth_token 

    if (req.query.oauth_token === undefined) { 

    // Just let the ErrorHandler does the rest 
    // like redirecting or just send message to client 
    var err = new Error('Unauthorized access.'); 
    err.status(406); // Or 403, or any HTTP status code 

    // Pass it to ErrorHandler 
    next(err); 

    } else { 
    // Do something here, or just 
    next(); 
    } 
} 

你的ErrorHandler

app.use(function(err, req, res, next){ 
    if (err.status == 406) { 
    // You can just do res.sendStatus() 
    res.sendStatus(406); // Set HTTP status code as 406 and send message to client 

    // Or chaining res.status() with res.send() 
    res.status(406).res.send(); // or res.render(), or res.json() 

    return; 

    } 

    // Others 
}); 

更多的ErrorHandler:http://expressjs.com/ja/guide/error-handling.html