如何在插件中访问请求?

时间:2015-04-24 23:09:14

标签: hapijs

是否有办法在Hapi插件中访问请求(是否存在相关路由)?

我知道我可以在我的插件中访问server,但似乎如果我尝试在插件的上下文中设置任何事件处理程序来获取请求,它们就不会触发。

例如,以下工作正常:

var Hapi = require('hapi');    
var server = new Hapi.Server();    

server.connection({port: 3000});

server.start(function () {
  console.log('hapi server started @ ', server.info.uri);
});

server.ext('onRequest', function (request, reply) {
  console.log(request);
  return reply.continue();
});

server.route({                                          
  path: '/',                                           
  method: 'GET',               
  handler: function (request, reply) {    
    reply({yo: 'noid'});                  
    server.log(['trace'], request);    
  }                                    
});

如果我在插件的上下文中尝试相同的事情,没有任何反应:

// Hapi App

var Hapi = require('hapi');    
var server = new Hapi.Server();    

server.register({ register: require('samplePlugin') }, function (error) {
  if(error) {
    console.log('failed to load plugin:', error);
  }
});

server.connection({port: 3000});

server.start(function () {
  console.log('hapi server started @ ', server.info.uri);
});

server.route({                                          
  path: '/',                                           
  method: 'GET',               
  handler: function (request, reply) {    
    reply({yo: 'noid'});                  
    server.log(['trace'], request);    
  }                                    
});

// Hapi Plugin
var samplePlugin = function (server, options, next) {                                                        
  'use strict';                                                                                        

  server.ext('onRequest', function (request, reply) {                                                  
    console.log(request);                                                                              
    return reply.continue();                                                                           
  });                                                                                                  

  next();                                                                                              
};                                                                                                     

exports.register = logger;                                                                             
exports.register.attributes = { pkg: require('./package.json') };

非常感谢任何帮助。我也很高兴听到其他方法。也许我正走错路(我是Hapi的新手)。谢谢你的阅读。

1 个答案:

答案 0 :(得分:2)

您的代码的问题是server.register()是异步的,但是您在其回调之外启动服务器。您需要确保仅在注册插件时启动服务器。您可以将server.start()部分移动到server.register()的回调中,轻松修复代码:

var Hapi = require('hapi');
var server = new Hapi.Server();

server.connection({port: 3000});

server.route({
  path: '/',
  method: 'GET',
  handler: function (request, reply) {
    reply({yo: 'noid'});
    server.log(['trace'], request);
  }
});

server.register({ register: require('./plugin') }, function (error) {
  if(error) {
    console.log('failed to load plugin:', error);
  }

  server.start(function () {
    console.log('hapi server started @ ', server.info.uri);
  });
});