node.js - 将域添加到另一个域似乎在 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?
解决方案
推荐阅读
- c++ - 从 std::vector 中删除元素
- sparql - SPARQL 选择单元文本(空白节点)
- pandas - 查找该值是否存在于数据框中
- javascript - 错误:无法匹配任何路由。网址段:'edit/604c39ab5d06fb205c654043
- c++ - 我收到一条错误消息,说未定义对类的引用,我不知道为什么。我已经设置了所有值
- php - 十月 CMS 中的 RainLab.User 和 User Extended 插件有一些奇怪的问题
- javascript - 乘法后,我希望输出为 2 位小数?怎么做?
- wireshark - 使用 pcap4j 模拟 HTTP/2 流
- javascript - 用于 div 容器的 JQuery 搜索功能
- apache-spark - 在 Apache Hadoop 上运行具有本地性质的 Spark 查询时出现数据局部性问题