Koa 发生错误时显示自定义页面

Qia*_*yue 2 error-handling koa koa2

这是问题的背景:我正在使用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);
}));
Run Code Online (Sandbox Code Playgroud)

但是我的错误页面总是显示为“内部服务器错误”,这是默认消息。好像ctx.body = 'Oops! internal server error';不能修改页面。

感谢您的帮助!

Fél*_*anz 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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