蓝鸟警告 "A promise was created in a handler but was not returned from it"
Bluebird warning "A promise was created in a handler but was not returned from it"
我收到有关未从 Bluebird 返回创建的承诺的警告,我不明白为什么以及如何重写我的代码。
(我已经尝试阅读 Bluebird API page and the anti-pattern page 上的警告,因为我怀疑这就是我正在做的事情)
在我的 view.js 文件中:
var express = require('express'),
router = express.Router(),
settings = myReq('config/settings'),
Sets = myReq('lib/Sets'),
log = myReq('lib/utils').getLogger('View');
router.get('/:setId/', function(req, res, next) {
var
setId = req.params.setId,
user = req.user,
set = new Sets(setId, user);
log.info('Got a request for set: ' + setId);
// The below line gives the warning mentioned
set.getSet().then(function(output) {
res.send(output);
}).error(function(e){
log.error(e.message, e.data);
res.send('An error occurred while handling set:' + e.message);
});
});
module.exports = router;
在我的 Sets.js 文件中我有:
var
Promise = require('bluebird'),
OE = Promise.OperationalError,
settings = myReq('config/settings'),
UserData = myReq('lib/userData'),
log = myReq('lib/utils').getLogger('sets'),
errorToSend = false;
module.exports = function(setId, user) {
var
sets = myReq('lib/utils').getDb('sets');
return {
getSet : function() {
log.debug('Getting set')
return sets.findOneAsync({
setId:setId
}).then(function(set){
if ( set ) {
log.debug('got set from DB');
} else {
set = getStaticSet(setId);
if ( ! set ) {
throw new OE('Failed getting db records or static template for set: ' + setId );
}
log.debug('got static set');
}
log.debug('I am handling set')
if ( ! checkSet(set) ) {
var e = new OE('Failed checking set');
e.data = set;
throw e;
}
return {
view : getView(set),
logic : set.logic,
canEdit : true,
error : errorToSend
};
});
}
};
};
所以我的 view.js 文件中带有 "set.getSet()" 的行给出了关于不返回创建的承诺的警告。看起来这个脚本仍然在做我期望的事情,但我不明白为什么我会收到警告。
堆栈跟踪:
Warning: a promise was created in a handler but was not returned from it
at Object.getSet (C:\dev\infoscrn\lib\Sets.js:36:25)
at C:\dev\infoscrn\routes\view.js:39:20
at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
at next (C:\dev\infoscrn\node_modules\express\lib\router\route.js:110:13)
at Route.dispatch (C:\dev\infoscrn\node_modules\express\lib\router\route.js:91:3)
at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
at C:\dev\infoscrn\node_modules\express\lib\router\index.js:267:22
at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:340:14)
at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:356:14)
at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:400:3)
at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
at Function.proto.handle (C:\dev\infoscrn\node_modules\express\lib\router\index.js:166:3)
at router (C:\dev\infoscrn\node_modules\express\lib\router\index.js:35:12)
at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\dev\infoscrn\node_modules\express\lib\router\index.js:302:13)
at C:\dev\infoscrn\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:321:12)
at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
at C:\dev\infoscrn\node_modules\express\lib\router\index.js:603:15
at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:246:14)
首先,尝试 update all your dependencies. There's been a recent version of Bluebird, which fixed an issue involving this warning。
接下来,确保 return from all your handlers。
然后,如果您仍然收到警告(就像我一样),您可以 disable this specific warning。我选择通过在我的环境中设置 BLUEBIRD_W_FORGOTTEN_RETURN=0
来做到这一点。
不要禁用警告。他们在那里是有原因的。
典型的模式是,如果您的 onfulfill 或 onreject 处理程序导致构建 Promise,它将 return 来自处理程序的 Promise(或从中派生的某些链),以便链采用该承诺的状态。
所以 Bluebird 会跟踪它何时成为 运行 您的处理程序函数之一,并且还会跟踪它何时调用 Promise 构造函数。如果它确定 Promise 是在 任何点 创建的,而你的处理程序是 运行 (包括调用堆栈中的任何地方),但那个 Promise 不是 return 从您的处理程序发出此警告,因为它认为您可能 忘记了 编写 return 语句。
因此,如果您合法地不关心在处理程序内部创建的 Promise,那么您所要做的就是明确地 return 来自您的处理程序的内容。如果您不关心从处理程序中 return 得到了什么(即,如果您不关心 Promise 实现的值是什么),那么只需 return null
。无论您 return,明确的 return(具体来说,return 值而不是 undefined
)告诉 Bluebird,您认为您知道自己在做什么,它不会不要发出此警告。
确保你在每个地方都有 return
声明,这是对我有用的解决方案。
我收到有关未从 Bluebird 返回创建的承诺的警告,我不明白为什么以及如何重写我的代码。
(我已经尝试阅读 Bluebird API page and the anti-pattern page 上的警告,因为我怀疑这就是我正在做的事情)
在我的 view.js 文件中:
var express = require('express'),
router = express.Router(),
settings = myReq('config/settings'),
Sets = myReq('lib/Sets'),
log = myReq('lib/utils').getLogger('View');
router.get('/:setId/', function(req, res, next) {
var
setId = req.params.setId,
user = req.user,
set = new Sets(setId, user);
log.info('Got a request for set: ' + setId);
// The below line gives the warning mentioned
set.getSet().then(function(output) {
res.send(output);
}).error(function(e){
log.error(e.message, e.data);
res.send('An error occurred while handling set:' + e.message);
});
});
module.exports = router;
在我的 Sets.js 文件中我有:
var
Promise = require('bluebird'),
OE = Promise.OperationalError,
settings = myReq('config/settings'),
UserData = myReq('lib/userData'),
log = myReq('lib/utils').getLogger('sets'),
errorToSend = false;
module.exports = function(setId, user) {
var
sets = myReq('lib/utils').getDb('sets');
return {
getSet : function() {
log.debug('Getting set')
return sets.findOneAsync({
setId:setId
}).then(function(set){
if ( set ) {
log.debug('got set from DB');
} else {
set = getStaticSet(setId);
if ( ! set ) {
throw new OE('Failed getting db records or static template for set: ' + setId );
}
log.debug('got static set');
}
log.debug('I am handling set')
if ( ! checkSet(set) ) {
var e = new OE('Failed checking set');
e.data = set;
throw e;
}
return {
view : getView(set),
logic : set.logic,
canEdit : true,
error : errorToSend
};
});
}
};
};
所以我的 view.js 文件中带有 "set.getSet()" 的行给出了关于不返回创建的承诺的警告。看起来这个脚本仍然在做我期望的事情,但我不明白为什么我会收到警告。
堆栈跟踪:
Warning: a promise was created in a handler but was not returned from it
at Object.getSet (C:\dev\infoscrn\lib\Sets.js:36:25)
at C:\dev\infoscrn\routes\view.js:39:20
at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
at next (C:\dev\infoscrn\node_modules\express\lib\router\route.js:110:13)
at Route.dispatch (C:\dev\infoscrn\node_modules\express\lib\router\route.js:91:3)
at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
at C:\dev\infoscrn\node_modules\express\lib\router\index.js:267:22
at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:340:14)
at param (C:\dev\infoscrn\node_modules\express\lib\router\index.js:356:14)
at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:400:3)
at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
at Function.proto.handle (C:\dev\infoscrn\node_modules\express\lib\router\index.js:166:3)
at router (C:\dev\infoscrn\node_modules\express\lib\router\index.js:35:12)
at Layer.handle [as handle_request] (C:\dev\infoscrn\node_modules\express\lib\router\layer.js:82:5)
at trim_prefix (C:\dev\infoscrn\node_modules\express\lib\router\index.js:302:13)
at C:\dev\infoscrn\node_modules\express\lib\router\index.js:270:7
at Function.proto.process_params (C:\dev\infoscrn\node_modules\express\lib\router\index.js:321:12)
at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:261:10)
at C:\dev\infoscrn\node_modules\express\lib\router\index.js:603:15
at next (C:\dev\infoscrn\node_modules\express\lib\router\index.js:246:14)
首先,尝试 update all your dependencies. There's been a recent version of Bluebird, which fixed an issue involving this warning。
接下来,确保 return from all your handlers。
然后,如果您仍然收到警告(就像我一样),您可以 disable this specific warning。我选择通过在我的环境中设置 BLUEBIRD_W_FORGOTTEN_RETURN=0
来做到这一点。
不要禁用警告。他们在那里是有原因的。
典型的模式是,如果您的 onfulfill 或 onreject 处理程序导致构建 Promise,它将 return 来自处理程序的 Promise(或从中派生的某些链),以便链采用该承诺的状态。
所以 Bluebird 会跟踪它何时成为 运行 您的处理程序函数之一,并且还会跟踪它何时调用 Promise 构造函数。如果它确定 Promise 是在 任何点 创建的,而你的处理程序是 运行 (包括调用堆栈中的任何地方),但那个 Promise 不是 return 从您的处理程序发出此警告,因为它认为您可能 忘记了 编写 return 语句。
因此,如果您合法地不关心在处理程序内部创建的 Promise,那么您所要做的就是明确地 return 来自您的处理程序的内容。如果您不关心从处理程序中 return 得到了什么(即,如果您不关心 Promise 实现的值是什么),那么只需 return null
。无论您 return,明确的 return(具体来说,return 值而不是 undefined
)告诉 Bluebird,您认为您知道自己在做什么,它不会不要发出此警告。
确保你在每个地方都有 return
声明,这是对我有用的解决方案。