如何输出从Hapi.js视图生成的视图编译器错误?

时间:2015-05-11 00:23:34

标签: node.js pug hapijs

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

3 个答案:

答案 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()); 
});

除了日志之外,我仍然希望在浏览器中看到这一点(在"开发模式"中)。