有没有一种方法可以使用Node.js域模块获取父域?

时间:2019-08-03 22:39:24

标签: node.js

考虑以下示例:

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();

是否有一种方法可以使用d0d1上下文中引用process

({d0在作用域中仅用于演示目的。)

3 个答案:

答案 0 :(得分:2)

您可以在domain._stack中按顺序查找活动域。它没有记录,但是domain已冻结,因此它无处可去。

此外,您可能要考虑从domain移至async_hooksasync_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自动将异步上下文信息传播给执行该任务的所有记录器。