2016-03-03 24 views
3

我是nodejs和co的新手。我用下面的express來表示co,因爲它更像是我習慣於在c#中使用的異步,我認爲代碼更具可讀性。如何在全球使用co處理錯誤

(req, res) => { 
     co(function*(){ 
      var book = req.book; 

      book.bookId = req.body.bookId; 
      book.title = req.body.title;    
      book.read = req.body.read; 

      yield book.save(); 

      res.json(book); 
     }).catch(err => res.status(500).send(err)); 
    } 

問題是,我每次調用co時,都必須在catch函數中處理異常。我想在全球範圍內處理異常情況,而不是中間件。但據我所知,co吞下了未處理的異常,所以我必須在每次調用co時處理catch。

我想出的一個可能的解決方案是將co包裝在一個函數中,該函數自動處理catch函數中的異常,並使用該包裝的函數。例如:

var myCo = function(genFunc){ 
    return co(genFunc) 
      .catch(err => someGlobalErrorHandler(err)) 
}; 

有沒有更好或更標準的方法?

+0

您可以使用標準明確的錯誤處理寬度這個小LIB:https://github.com/mciparelli/co-express –

+0

感謝。這正是我正在尋找的。也許添加您的評論作爲答案? –

回答

0

您可以使用標準明確的錯誤處理寬度此small lib

var co = require('co'); 

module.exports = function wrap(gen) { 
    var fn = co.wrap(gen); 

    if (gen.length === 4) { 
    return function(err, req, res, next) { 
     return fn(err, req, res, next).catch(next); 
    } 
    } 

    return function(req, res, next) { 
    return fn(req, res, next).catch(next); 
    }; 
};