Hapijs 自定义 500 错误页面
Hapijs Custom 500 Error Page
查看 Hapi 的文档,并尝试 google,我可以找到如何设置 404 页面,但我找不到任何关于设置 500 页面的信息。
我尝试添加如下错误处理程序:
server.on('internalError', function (request, err) {
console.log("Internal Error:", err);
request.reply.view('errors/500', {
error: err
}).code(500);
});
但是我的钩子从来没有被调用过。有没有一种使用 Hapijs return 自定义 500 页面的简单方法?
您需要在 onPreResponse
扩展函数中捕获错误响应并在那里设置新的 HTML 响应。
同样的原则适用于任何 Boom 错误,无论它是由您在处理程序中设置的还是由 hapi 内部设置的(例如 404 未找到或 401 未授权来自失败的身份验证。
这是一个您可以自己尝试的示例:
index.js
const Hapi = require('hapi');
const Path = require('path');
const server = new Hapi.Server();
server.connection({ port: 4000 });
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(new Error('I\'ll be a 500'));
}
});
server.ext('onPreResponse', (request, reply) => {
if (request.response.isBoom) {
const err = request.response;
const errName = err.output.payload.error;
const statusCode = err.output.payload.statusCode;
return reply.view('error', {
statusCode: statusCode,
errName: errName
})
.code(statusCode);
}
reply.continue();
});
server.register(require('vision'), (err) => {
if (err) {
throw err;
}
server.views({
engines: {
hbs: require('handlebars')
},
path: Path.join(__dirname, 'templates')
});
server.start((err) => {
if (err) {
throw err;
}
console.log('Server running at:', server.info.uri);
});
});
templates/error.hbs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{title}}</title>
<style>
body {
text-align: center;
background: #B0B0B0;
color: #222;
}
.error h1 {
font-size: 80px;
margin-bottom: 0;
}
</style>
</head>
<body>
<div class="error">
<h1>⚠<br/>{{statusCode}}</h1>
<h2>{{errName}}</h2>
</div>
</body>
</html>
通过转至 http://localhost:4000/ 查看您的自定义错误页面来对其进行测试:
这种方法捕获任何 Boom 响应,包括那些由 hapi 而不是我们内部生成的响应。因此也适用于 4xx 错误。尝试导航至 http://localhost:4000/notapage,您将获得相同的漂亮页面,但 404:
对于那些寻找与 Hapi v17+ 兼容的答案的人,相同的代码 index.js
代码将被翻译为:
index.js
"use strict";
const hapi = require('hapi');
const path = require('path');
const server = new hapi.Server({ port: 4000 });
server.route({
method: 'GET',
path: '/',
handler: (request, h) {
return new Error('I\'ll be a 500');
}
});
server.ext({
type: 'onPreResponse',
method: (request, h) => {
if (request.response.isBoom) {
const err = request.response;
const errName = err.output.payload.error;
const statusCode = err.output.payload.statusCode;
return h.view('error', {
statusCode: statusCode,
errName: errName
})
.code(statusCode);
}
return h.continue;
}
});
(async()=>{
await server.register([ require('@hapi/vision') ]);
server.views({
engines: { hbs: require('handlebars') },
path: Path.join(__dirname, 'templates')
});
await server.start();
return `Server running at: ${server.info.uri}`;
})().then(console.log).catch(console.error);
查看 Hapi 的文档,并尝试 google,我可以找到如何设置 404 页面,但我找不到任何关于设置 500 页面的信息。
我尝试添加如下错误处理程序:
server.on('internalError', function (request, err) {
console.log("Internal Error:", err);
request.reply.view('errors/500', {
error: err
}).code(500);
});
但是我的钩子从来没有被调用过。有没有一种使用 Hapijs return 自定义 500 页面的简单方法?
您需要在 onPreResponse
扩展函数中捕获错误响应并在那里设置新的 HTML 响应。
同样的原则适用于任何 Boom 错误,无论它是由您在处理程序中设置的还是由 hapi 内部设置的(例如 404 未找到或 401 未授权来自失败的身份验证。
这是一个您可以自己尝试的示例:
index.js
const Hapi = require('hapi');
const Path = require('path');
const server = new Hapi.Server();
server.connection({ port: 4000 });
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
reply(new Error('I\'ll be a 500'));
}
});
server.ext('onPreResponse', (request, reply) => {
if (request.response.isBoom) {
const err = request.response;
const errName = err.output.payload.error;
const statusCode = err.output.payload.statusCode;
return reply.view('error', {
statusCode: statusCode,
errName: errName
})
.code(statusCode);
}
reply.continue();
});
server.register(require('vision'), (err) => {
if (err) {
throw err;
}
server.views({
engines: {
hbs: require('handlebars')
},
path: Path.join(__dirname, 'templates')
});
server.start((err) => {
if (err) {
throw err;
}
console.log('Server running at:', server.info.uri);
});
});
templates/error.hbs
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{title}}</title>
<style>
body {
text-align: center;
background: #B0B0B0;
color: #222;
}
.error h1 {
font-size: 80px;
margin-bottom: 0;
}
</style>
</head>
<body>
<div class="error">
<h1>⚠<br/>{{statusCode}}</h1>
<h2>{{errName}}</h2>
</div>
</body>
</html>
通过转至 http://localhost:4000/ 查看您的自定义错误页面来对其进行测试:
这种方法捕获任何 Boom 响应,包括那些由 hapi 而不是我们内部生成的响应。因此也适用于 4xx 错误。尝试导航至 http://localhost:4000/notapage,您将获得相同的漂亮页面,但 404:
对于那些寻找与 Hapi v17+ 兼容的答案的人,相同的代码 index.js
代码将被翻译为:
index.js
"use strict";
const hapi = require('hapi');
const path = require('path');
const server = new hapi.Server({ port: 4000 });
server.route({
method: 'GET',
path: '/',
handler: (request, h) {
return new Error('I\'ll be a 500');
}
});
server.ext({
type: 'onPreResponse',
method: (request, h) => {
if (request.response.isBoom) {
const err = request.response;
const errName = err.output.payload.error;
const statusCode = err.output.payload.statusCode;
return h.view('error', {
statusCode: statusCode,
errName: errName
})
.code(statusCode);
}
return h.continue;
}
});
(async()=>{
await server.register([ require('@hapi/vision') ]);
server.views({
engines: { hbs: require('handlebars') },
path: Path.join(__dirname, 'templates')
});
await server.start();
return `Server running at: ${server.info.uri}`;
})().then(console.log).catch(console.error);