Koa.js:集中式错误处理

时间:2018-07-19 10:28:24

标签: node.js mongoose error-handling koa koa2

我正在通过Mongoose使用Koa.js和MongoDB。我想知道如何实现完美的集中式错误处理机制。

例如,我编写的通过Mongoose连接到MongoDB的函数中存在一些问题。这就是为什么我得到以下错误。但是,我想捕获此错误并以集中方式处理它。意思是,我希望所有错误和警告(无论来自应用程序的哪个部分)都由我的应用程序中的函数处理,该函数将对其进行记录。

warning.js:18 (node:11776) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): MongoNetworkError: failed to connect to server [127.0.0.1:27017] on first connect [MongoNetworkError: read ECONNRESET]
    writeOut @ warning.js:18
    output @ warning.js:69
    process.on @ warning.js:100
    emitOne @ events.js:116
    emit @ events.js:211
    (anonymous) @ warning.js:74
    _combinedTickCallback @ next_tick.js:131
    _tickCallback @ next_tick.js:180
    TickObject (async)
    init @ inspector_async_hook.js:22
    emitInitNative @ async_hooks.js:472
    emitInitScript @ async_hooks.js:388
    nextTick @ next_tick.js:270
    process.emitWarning @ warning.js:146
    emitWarning @ promises.js:75
    emitPendingUnhandledRejections @ promises.js:95
    _tickCallback @ next_tick.js:189
    Show 11 more blackboxed frames

warning.js:18 (node:11776) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    writeOut @ warning.js:18
    output @ warning.js:69
    process.on @ warning.js:100
    emitOne @ events.js:116
    emit @ events.js:211
    (anonymous) @ warning.js:74
    _combinedTickCallback @ next_tick.js:131
    _tickCallback @ next_tick.js:180
    TickObject (async)
    init @ inspector_async_hook.js:22
    emitInitNative @ async_hooks.js:472
    emitInitScript @ async_hooks.js:388
    nextTick @ next_tick.js:270
    process.emitWarning @ warning.js:146
    emitWarning @ promises.js:78
    emitPendingUnhandledRejections @ promises.js:95
    _tickCallback @ next_tick.js:189
    Show 11 more blackboxed frames

warning.js:18 (node:11776) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): MongoNetworkError: failed to connect to server [127.0.0.1:27017] on first connect [MongoNetworkError: read ECONNRESET]
    writeOut @ warning.js:18
    output @ warning.js:69
    process.on @ warning.js:100
    emitOne @ events.js:116
    emit @ events.js:211
    (anonymous) @ warning.js:74
    _combinedTickCallback @ next_tick.js:131
    _tickCallback @ next_tick.js:180
    TickObject (async)
    init @ inspector_async_hook.js:22
    emitInitNative @ async_hooks.js:472
    emitInitScript @ async_hooks.js:388
    nextTick @ next_tick.js:270
    process.emitWarning @ warning.js:146
    emitWarning @ promises.js:75
    emitPendingUnhandledRejections @ promises.js:95
    _tickCallback @ next_tick.js:189
    Show 11 more blackboxed frames

1 个答案:

答案 0 :(得分:1)

Koa Wiki中有一个有关错误处理的部分:https://github.com/koajs/koa/wiki/Error-Handling

他们建议使用错误处理程序中间件作为应用程序中的第一批中间件之一,以便向下游抛出的任何错误都会冒出来。

他们在Wiki中的示例:

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = err.message;
    ctx.app.emit('error', err, ctx);
  }
});

app.on('error', (err, ctx) => {
  /* centralized error handling:
   *   console.log error
   *   write error to log file
   *   save error and request information to database if ctx.request match condition
   *   ...
  */
});