来自express世界,如果编译Jade模板时出错,则错误会输出到浏览器,其中包含模板错误的详细信息,包括行号。当视图模板编译器遇到错误时,我希望在Hapi.js中看到此级别的错误详细信息。
相反,使用Hapi.js,我收到500内部服务器错误。我在日志中看到的唯一输出如下:
150511/005652.910, [response], http://localhost:3000: get /abc123 {} 500 (24ms)
这是我设置的基础知识。
var Hapi = require('hapi');
var server = new Hapi.Server();
server.connection({ port: 3000 });
server.views({
engines: { jade: require('jade') },
path: __dirname + '/views',
compileOptions: {
pretty: true,
debug: true,
compileDebug: true
}
});
server.route({
method: 'GET',
path: '/{name}',
handler: function (request, reply) {
reply.view('page', {name: request.params.name});
}
});
// I know putting my plugins in an array is not necessary but I like it.
var plugins = [{
register: Good,
options: {
reporters: [{
reporter: require('good-console'),
events: {
response: '*',
log: '*'
}
}]
}
}];
server.register(plugins, function (err) {
if (err) {
throw err; // something bad happened loading the plugin
}
server.start(function () {
server.log('info', 'Server running at: ' + server.info.uri);
});
});
答案 0 :(得分:6)
本周也有同样的问题。
parking_lots = list(ParkingLot.objects.all()) # Hit Database once
odd_lots = parking_lots[0::2]
even_lots = parking_lots[1::2]
它不会输出到客户端(您仍然会收到500错误),但编译错误将显示在终端控制台中。
答案 1 :(得分:2)
由于模板的渲染发生在onPreResponse
之后,因此无法在此时捕获错误。将错误发送到浏览器的方法虽然有点粗糙,但是在扩展点内进行编译的干运行,然后将错误发送到浏览器:
server.ext('onPreResponse', function (request, reply) {
var response = request.response;
if (response.variety === 'view') {
var source = response.source;
// Let's pre-render the template here and see if there's any errors
return server.render(source.template, source.context, function (err) {
if (err) {
return reply(err.message); // transmit the compile error to browser
}
reply.continue();
});
}
reply.continue();
});
显然,这会对性能产生影响,因为您在正常情况下会将视图渲染两次,因此您需要在生产中禁用它。
答案 2 :(得分:1)
一种可能的解决方案是登录服务器'请求错误'。例如:
server.on('request-error', function (request, err) {
//logs the object
server.log('error', err);
//logs the view compiler error line number and details
server.log('error', err.toString());
});
除了日志之外,我仍然希望在浏览器中看到这一点(在"开发模式"中)。