区分NodeJS中的函数调用

时间:2017-06-13 16:21:41

标签: javascript node.js module

让我说我的主模块有一个函数main(x) 它完成它的工作并调用函数foo(y),它在代码中更深入的其他模块中。

让我们说它被叫了两次:

所以有人打电话给:main(5)和其他人main(8)

函数foo的模块中有一种方法可以知道调用它的方法吗? 即main(5)main(8)

的来电

我问,因为foo并不关心号码58所以我不希望它将其作为参数。

我正在寻找全球性的东西:可能在process对象中。 我不能罚款。

我问,因为我正在使用Express。每个请求都有自己的请求ID。我想将它一直记录下来,而不需要将请求ID传递给我的所有函数,因为它们只需要它来记录所以它会很难看

2 个答案:

答案 0 :(得分:0)

全局存储值不是一种方法,因为您可以让一个进程同时处理多个请求。

您可以使用的一种方法是将foo()放在一个内部包含您需要记录的任何值的对象中,如下所示:

foo()模块

module.exports = function (requestId) {

    function internalFunction() {
        writeToLog(requestId, "text to log");
        // do some stuff
    }

    function foo() {
        internalFunction();
    }

    function foo2() {
        internalFunction();
    }

    // external functions
    return { foo, foo2 };
};

main()模块

function main(requestId) {
    let fooProvider = fooModule(requestId);

    fooProvider.foo();
}

答案 1 :(得分:0)

这是一个很好的解决方案:

<强> main.js

&#13;
&#13;
let domain = require('domain');
let foo = require('./foo');
let main = function (x) {
    foo();
};

let d1 = domain.create();
let d2 = domain.create();

d1.y = "domain1";
d2.y = "domain2";

d1.run(function () {
    main(5)
});
d2.run(function () {
    main(2)
});
&#13;
&#13;
&#13;

<强> foo.js

&#13;
&#13;
let domain = require('domain');

module.exports = function () {
    console.log(process.domain.y);
};
&#13;
&#13;
&#13;

因此对于Express用户来说:

&#13;
&#13;
app.use('*', function(req, res, next) {
  const d     = domain.create();
  d.yourRequestData=req.requestId; //or whatever you need
  d.run(next);
});
&#13;
&#13;
&#13;

现在您的所有代码都可以访问相关域并使用requestId。

信用:BenL