2

这是问题的背景:我正在使用Koa 2跟踪开球 koa。但是开球中的练习是为 Koa 1 设计的。我为 Koa 2 的这个问题创建了一个问题:Koa 2的错误处理程序的任务无法通过

简而言之,我的问题是如何在发生 500 错误时显示自定义错误页面。

以下是代码:

// error handler middleware
function errorHandler(ctx, next) {
  try {
   return next();
  }
  catch(err) {
    ctx.status = err.status || 500;
    // I would like to display the custom message as follows     
    ctx.body = 'Oops! internal server error';   
    // with emitting the error event, don't work
    // ctx.app.emit('error', err, ctx);      
  }
}

// to generate error
app.use(router.get('/error', ctx => {
  ctx.throw('oops', 500);
}));

但我的错误页面始终显示为“内部服务器错误”,这是默认消息。似乎ctx.body = 'Oops! internal server error';无法修改页面。

感谢您的帮助!

4

1 回答 1

5

如果您使用的是 Koa2,则不必在中间件内部返回,而是使用await. 顺便说一句,你的中间件函数必须是一个async函数。

这是一个组合 404 和 500 中间件的示例:

  app.use(async (ctx, next) => {
    try {
      await next()

      if (ctx.status === 404) ctx.throw(404)
    } catch (err) {
      console.error(err)
      ctx.status = err.status || 500
      ctx.body = errorPage.render({ // Use your render method
        error: err,
      })
    }
  })

  // Your normal routes here

首先,Koa 等待链中的下一个中间件(这是您的正常路由)。如果什么也没找到或发生错误,中间件链会倒退并执行下一行,这会抛出 a404并将其捕获在catch.

现在在 catch 语句中,您可以得到404, 500(默认情况下)或者5xx是否发生了其他错误。

页面的主体也设置了模板的渲染并将错误传递给模板,以便您可以使用它。

您不必发出错误,因为这是链中的最后一个捕获。

于 2016-03-18T14:16:22.013 回答