Koa 出错时显示自定义页面

Display custom page when error happens in Koa

这里是问题的背景:我正在关注kick-off-koa using Koa 2. But the exercises in the kick-off are designed for Koa 1. I've created an issue for this problem of Koa 2 : Task of error handler with Koa 2 cannot pass

简而言之,我的问题是如何在发生 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);
}));

但我的错误页面始终显示为 "Internal Server Error",这是默认消息。 ctx.body = 'Oops! internal server error'; 似乎无法修改页面。

感谢您的帮助!

如果您使用的是 Koa2,则不必 return 内部中间件,而是使用 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 等待链中的下一个中间件(这是您的正常路由)。如果没有找到或发生错误,中间件链将向后移动并执行下一行,这会抛出一个 404 并在 catch.

中捕获它

现在在 catch 语句中,如果发生其他错误,您可以得到 404500(默认)或 5xx

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

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