在Node JS(Hapijs)中如何全局访问Server变量

时间:2017-07-05 14:58:24

标签: node.js module hapijs

一定很简单,但我找不到一个好的解决方案。

在节点模块中,例如我想记录出错的地方。所以我需要使用Hapi函数server.log(...)。一个例子:

在server.js中:

const server = new Hapi.Server({...});
server.connection({port:3000});
server.start((err) => {
  if (err) { throw err }
}

在文件test.js中,我想使用server.js中创建的服务器变量。它应该可以在任何模块中使用,因为记录和加载其他插件。

class Test {
  logInfo(text) {
    server.log(['info'], text);  // this will not work.
  }
}
module.exports = new Test();

我可以将服务器添加到模块的每次调用中,但那可能是一种过度杀伤。

如何在创建模块之外获得对服务器变量的引用?

1 个答案:

答案 0 :(得分:0)

如果您想在请求期间记录消息,可以使用request.log(...)

或者,您可以通过访问处理程序中server对象上的request对象来使用server.log(...)

{
    method: 'GET',
    path: '/do/stuff',
    handler: function (request, reply) {
        request.server.log('server.log() method');

        request.log('request.log() method');

        const test = new Test(request.server);

        test.logInfo('some text here');
    }
}

也可以在hapi中查看我的answer on logging

在您的情况下,如果您特别想要将消息记录为hapi服务器事件,则需要将对服务器对象的引用传递给模块。

class Test {
    private server;

    constructor(server) {
        this.server = server;
    }

    logInfo(text) {
        this.server.log(['info'], text);  // this will work.
    }
}

但是你的问题的评论者可能是对的。如果要避免模块的紧密耦合,则应避免使用此模式。