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 语句中,如果发生其他错误,您可以得到 404
、500
(默认)或 5xx
。
页面的正文也设置了模板渲染并将错误传递给模板,以便您可以使用它。
您不必发出错误,因为这是链中的最后一个捕获。
这里是问题的背景:我正在关注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 语句中,如果发生其他错误,您可以得到 404
、500
(默认)或 5xx
。
页面的正文也设置了模板渲染并将错误传递给模板,以便您可以使用它。
您不必发出错误,因为这是链中的最后一个捕获。