从hapi插件内部抛出时,控制台中没有显示错误

时间:2016-03-08 16:50:20

标签: hapijs

由于某些原因,当我使用nodemon启动hapi服务器并导航到http://localhost:3000/hapi-ext-fetch时,服务器控制台中没有出现错误,这使得调试变得非常困难。这是我的代码:

var Hapi = require('hapi');
var Joi = require('joi');
var fetch = require('isomorphic-fetch');

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

server.connection({ port: 3000 });

var myPlugin = {
  register: function (server, options, next) {
    server.route([
      {
        method: 'GET',
        path: '/{name}',
        handler: function ( request, reply ) {
          throw new Error('this error isnt shown!');
        },
        config: {
          validate: {
            params: {
              name: Joi.string().min(3).max(10)
            }
          }
        }
      }
    ]);
    next();
  }
};

myPlugin.register.attributes = {
  name: 'myPlugin',
  version: '1.0.0'
};

server.register([
  {
    register: myPlugin,
    routes: {
      prefix: '/test'
    }
  }
], function() {
  server.ext( 'onPreResponse', ( request, reply ) => {
    if ( typeof request.response.statusCode !== 'undefined' ) {
      return reply.continue();
    }
    fetch('http://localhost:3000/test/whatever')
    .then(function(result) {
      reply(result);
    })
    .catch(function(err) {
      reply('error on server side: ' + err.stack);
    });
  });

  server.start((err) => {
    if (err) {
      throw err;
    }
    console.log('Server running at:', server.info.uri);
  });
});

我正在使用hapi 13.0.0

1 个答案:

答案 0 :(得分:1)

不能说我完全理解你的用例,如果这个问题对其他人有帮助。但你想要做的似乎是:

  • 向/ hapi-fetch-ext
  • 发送请求
  • 请求404
  • 然后在onPreResponse去取另一条路线/测试/无论
  • 希望看到“此错误未显示错误”

不确定您是否知道但这会导致无限循环的请求(您的提取会导致另一个onPreResponse等等等等)。所以你应该只能去404:

server.ext( 'onPreResponse', ( request, reply ) => {

    if (request.response.isBoom && request.response.output.statusCode === 404) {
        return fetch('http://localhost:3000/test/whatever')
        .then(function(result) {
            reply(result);
        })
        .catch(function(err) {
            reply('error on server side: ' + err.stack);
        });
    }

    return reply.continue();
});