我创建域并运行它。现在输入域时process.domain
指向当前活动域。但后来我运行Promise并得到一些奇怪的东西。
'use strict';
var domainCreate = require('domain').create;
var domain = domainCreate();
domain.requestId = 1;
domain.run(function() {
console.log(process.domain === domain); // true
console.log(process.domain.requestId); // 1
Promise.resolve().then(function() {
console.log(process.domain === domain); // false!!!
console.log(process.domain.requestId); // throw new TypeError('Cannot read property 'requestId' of undefined')
}).catch(function(err) {
console.error(err.stack);
});
});
为什么process.domain
在Promise链中未定义?
答案 0 :(得分:6)
原生承诺和域名不混合。有一个问题here,其中提到了here):
我现在没有深入研究V8的本机承诺已经实施,但如果有必要修补它们以便与域一起工作,那就不会让我感到惊讶。
该线程中的最新评论(here)表明这仍然是Node v6的问题(它是)。
对该问题的评论之一表明,使用像bluebird
这样的第三方承诺实现可能会更好(您的示例代码可以使用它),但考虑到域名被认为是一个hack(因此有been deprecated),我认为您应该考虑重新实现代码而不使用域。
答案 1 :(得分:0)
根据Node.js文档模块"域"不推荐使用稳定级别0.更好地以另一种方式处理错误 https://nodejs.org/api/domain.html