考虑以下示例:
const domain = require('domain');
const main = () => {
const d0 = domain.create();
d0.name = 'd0';
d0.run(() => {
const d1 = domain.create();
d1.name = 'd1';
d1.run(() => {
// Is there a way to get reference to d0 using `process`?
console.log(process.domain.name);
});
});
};
main();
是否有一种方法可以使用d0
从d1
上下文中引用process
?
({d0
在作用域中仅用于演示目的。)
答案 0 :(得分:2)
您可以在domain._stack
中按顺序查找活动域。它没有记录,但是domain
已冻结,因此它无处可去。
此外,您可能要考虑从domain
移至async_hooks
或async_hooks
包装器。
答案 1 :(得分:1)
您可以通过args(https://nodejs.org/api/domain.html#domain_domain_run_fn_args)传递父级
下面的示例
const domain = require('domain');
const main = () => {
const d0 = domain.create();
d0.name = 'd0';
d0.run(() => {
const d1 = domain.create();
d1.name = 'd1';
d1.run((parent) => {
console.log(process.domain.name);
console.log('parent:', parent.name);
}, process.domain);
});
};
main();
答案 2 :(得分:-1)
一种可能的解决方案是例如对猴子domain
进行补丁
const domain = require('domain');
const originalCreate = domain.create;
domain.create = (...args) => {
const parentDomain = process.domain || null;
const nextDomain = originalCreate(...args);
nextDomain.parentDomain = parentDomain;
return nextDomain;
};
这样,每个域都可以通过parentDomain
来访问父域,例如
const findParentDomainNames = () => {
const parentDomainNames = [];
let currentDomain = process.domain;
while (currentDomain && currentDomain.parentDomain) {
currentDomain = currentDomain.parentDomain;
parentDomainNames.push(currentDomain.name);
}
return parentDomainNames;
};
const main = () => {
const d0 = domain.create();
d0.name = 'd0';
d0.run(() => {
const d1 = domain.create();
d1.name = 'd1';
d1.run(() => {
const d2 = domain.create();
d2.name = 'd2';
d2.run(() => {
console.log(findParentDomainNames());
});
});
});
};
main();
上面的照片:
[
'd1',
'd0'
]
这里是一个示例用例:Roarr记录器使用parentDomain
自动将异步上下文信息传播给执行该任务的所有记录器。