首页 > 解决方案 > 将域添加到另一个域似乎在 nodejs 中不起作用

问题描述

在 nodejs v11 中:下面的代码行为不符合预期:

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

d1.on('error', (err) => {
  console.log('caught by d1', err);   // not run in this case
});

d1.add(d2);
let f = d2.bind(() => {
  throw 'this is a test'
})

f();

这是实际结果:

/test123.js:11
  throw 'this is a test'
  ^
this is a test

当然,f抛出的错误函数不会路由到 d1 的错误处理程序。但是根据 Nodejs 的文档:

https://nodejs.org/dist/latest-v11.x/docs/api/domain.html#domain_domain_add_emitter

将发射器显式添加到域。如果发射器调用的任何事件处理程序抛出错误,或者发射器发出“错误”事件,它将被路由到域的“错误”事件,就像隐式绑定一样。

当我们运行d1.add(d2)时,将 f 绑定到 d2 并运行 f。然后 d2 将发出一个错误事件,该事件应路由到 d1 的错误处理程序,因为 d2 自己的错误处理程序尚未定义。下面的演示符合我的理解:

let domain = require('domain');
let d1 = domain.create();
let d2 = domain.create();
d1.on('error', (err) => {
  console.log('caught by d1', err);  //run in this case
});

d1.add(d2);
d2.emit('error', 123);

并输出:节点 test123.js 被 d1 123 捕获

显然 d1 捕捉到了 d2 发出的错误事件。所以我的问题是:有什么区别:为什么域 d1 无法捕获由绑定到域 d2 的函数引发的错误引发的错误事件 d2?

标签: node.jsdnseventemitter

解决方案


推荐阅读