【问题标题】:How to catch unhandled Promise rejections in a Restify middleware?如何在 Restify 中间件中捕获未处理的 Promise 拒绝?
【发布时间】:2017-04-25 19:24:09
【问题描述】:

我正在 Node.js 上编写一个 Restify 应用程序。而且我需要有一个函数,当 Restify 回调中发生一些错误时调用该函数。此函数应向客户端发送响应。如果我没有使用 Promises 或异步函数,我可以这样做:

server.on('uncaughtException', (req, res, route, err) => {
  log.error(err);
  res.send(err);
});

但是如果我的回调是async函数,那么函数内部的异常不会被调用,而是会引发unhandledPromiseRejection

我如何重构我的代码,使其能够像处理常见错误一样处理未处理的 Promise 拒绝?

是的,我知道我可以检查 Restify 中间件本身内部的错误,但它仍然使代码更复杂,更容易编写

if (!core.validateUUID(req.params.deviceId)) {
  throw new Error(`Device ${req.params.deviceId} is wrong`)
}

然后

if (!core.validateUUID(req.params.deviceId)) {
  return next(new restify.InvalidArgumentError({ body: {
    success: false,
    error: `Device ${req.params.deviceId} is wrong`,
  } }));
}

【问题讨论】:

  • 你不能只听“unhandledRejection”事件吗?见:nodejs.org/api/process.html#process_event_unhandledrejection
  • @MattDiamond 我可以,但这样我将无法获得reqres 对象,我需要res 对象将错误详细信息返回给用户
  • 难以置信的是,2020 年Restify 没有捕捉到Promise Rejection 中的错误

标签: javascript node.js promise async-await restify


【解决方案1】:

我为此苦苦挣扎了一段时间,并想出了一个简单的解决方案。我创建了一个简单的包装器函数,它包装了路由处理程序/中间件并在 Promise 中运行代码。这样,可以处理未处理的拒绝和未捕获的异常是相同的回调:

// your error general handler
function errorResponse(req, res, err) { ... }

/**
 * When using promises inside handler, you need to return the Promise from it to allow proper rejection handling
 *
 * @param {Function} callback with `req`, `res` and `next` parameters
 * @returns {Function}
 */
function catcher(callback) {
  return (req, res, next) => {
    Promise
      .resolve()
      .then(() => callback(req, res, next))
      .catch(err => errorResponse(req, res, err));
  };
}

// use it like this
server.use(catcher(middleware1));
server.post(catcher(postRoute));
server.get(catcher(getRoute));

在处理程序中使用 Promise 时,需要从中返回 Promise 以允许正确的拒绝处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 2015-06-23
    • 2017-11-20
    • 1970-01-01
    • 2019-03-10
    • 2018-03-19
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多