【问题标题】:How do I output view compiler errors generated from Hapi.js views?如何输出从 Hapi.js 视图生成的视图编译器错误?
【发布时间】:2015-05-16 03:42:44
【问题描述】:

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

【问题讨论】:

    标签: node.js pug hapijs


    【解决方案1】:

    这周也遇到了同样的问题。

    var server = new Hapi.Server({
      debug: {
        request: ['error']
      }
    });
    

    它不会输出到客户端(你仍然会得到一个 500 错误),但编译错误会显示在终端控制台中。

    【讨论】:

    • 这是一个完整的救星。
    【解决方案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();
    });
    

    显然这会对性能产生影响,因为您在正常情况下会渲染两次视图,因此您需要在生产中禁用它。

    【讨论】:

      【解决方案3】:

      一种可能的解决方案是登录服务器“请求错误”。例如:

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

      除了日志之外,我仍然希望在浏览器中(在“开发模式”下)看到这个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        • 2021-04-11
        相关资源
        最近更新 更多