如何访问插件中的请求?

How to access a request within a plugin?

有没有办法在 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 的新手)。感谢阅读。

您的代码的问题是 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);
  });
});