Hapijs自定义500错误页面

通过Hapi的文档查看,并试图谷歌,我可以find如何设置404页面,但我找不到有关设置500页的任何内容。

我试图添加一个error handling程序如下所示:

server.on('internalError', function (request, err) { console.log("Internal Error:", err); request.reply.view('errors/500', { error: err }).code(500); }); 

但我的钩子永远不会被调用。 有没有简单的方法来返回一个自定义的500页与Hapijs?

您需要在onPreResponse扩展函数中捕获错误响应,并在其中设置新的HTML响应。

同样的原则适用于任何Boom错误,不pipe它是你在处理程序中设置的还是由hapi在内部设置的(例如404未find或401未经授权从失败的身份validation中设置。

下面是一个你可以尝试自己的例子:

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); }); }); 

模板/ 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>&#x26a0;<br/>{{statusCode}}</h1> <h2>{{errName}}</h2> </div> </body> </html> 

通过转到http:// localhost:4000 /来查看您的自定义错误页面:

在这里输入图像描述

这种方法可以捕捉任何Boom响应,包括由hapi而不是由我们内部生成的响应。 因此也会使用4xx错误。 尝试导航到http:// localhost:4000 / notapage ,你会得到相同的漂亮的页面,但是对于404:

在这里输入图像描述