【问题标题】:How to handle errors globally using co in express如何在 express 中使用 co 全局处理错误
【发布时间】:2016-06-16 05:22:20
【问题描述】:

我是 nodejs 和 co 的新手。我在 express 中使用 co,如下所示,因为它更像是我在 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))
};

有没有更好或更标准的方法?

【问题讨论】:

  • 您可以使用标准的快速错误处理程序宽度这个小库:github.com/mciparelli/co-express
  • 谢谢。这正是我一直在寻找的。也许添加您的评论作为答案?

标签: node.js express co


【解决方案1】:

您可以使用标准 express 错误处理程序宽度 this 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);
  };
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2019-05-21
    • 2022-08-21
    • 2017-04-19
    • 2019-10-10
    相关资源
    最近更新 更多