让我说我的主模块有一个函数main(x)
它完成它的工作并调用函数foo(y)
,它在代码中更深入的其他模块中。
让我们说它被叫了两次:
所以有人打电话给:main(5)
和其他人main(8)
函数foo
的模块中有一种方法可以知道调用它的方法吗?
即main(5)
或main(8)
我问,因为foo
并不关心号码5
或8
所以我不希望它将其作为参数。
我正在寻找全球性的东西:可能在process
对象中。
我不能罚款。
我问,因为我正在使用Express。每个请求都有自己的请求ID。我想将它一直记录下来,而不需要将请求ID传递给我的所有函数,因为它们只需要它来记录所以它会很难看
答案 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 强>
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;
<强> foo.js 强>
let domain = require('domain');
module.exports = function () {
console.log(process.domain.y);
};
&#13;
因此对于Express用户来说:
app.use('*', function(req, res, next) {
const d = domain.create();
d.yourRequestData=req.requestId; //or whatever you need
d.run(next);
});
&#13;
现在您的所有代码都可以访问相关域并使用requestId。
信用:BenL