如何使用co in express全局处理错误

时间:2016-03-03 03:42:37

标签: node.js express co

我是nodejs和co的新手。我正在使用co in express,如下所示,因为它更像是我在c#中习惯的异步等待,我认为代码更具可读性。

(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))
};

是否有更好或更标准的方式?

1 个答案:

答案 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);
  };
};