蓝鸟警告“一个承诺是在一个处理程序中创建的,但没有从它返回” [英] Bluebird warning "A promise was created in a handler but was not returned from it"
问题描述
我收到了关于没有从Bluebird返回创建的承诺的警告,我不明白为什么以及如何重写代码。
(我已经尝试阅读关于 Bluebird API 页面和反模式页面,因为我怀疑这是我在做什么) p>
在我的view.js文件中:
var express = 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('有一个请求set:'+ setId);
//下面的行给出了提到的
set.getSet()的警告,然后(function(output){
res.send(output);
})。 (function(e){
log.error(e.message,e.data);
res.send('处理集合时发生错误:'+ 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
})然后(function(set){
if(set){
log.debug('from set from DB' ;
} else {
set = getStaticSet(setId);
if(!set){
throw new OE('Failed get db record or static template for set:'+ setId);
}
log.debug('get static set');
}
log.debug('我正在处理集合')
if(!checkSet(set)){
var e = new OE('Failed checking set');
e.data = set;
throw e;
}
return {
查看:getView(set),
logic:set.logic,
canEdit:true,
error:errorToSend
};
});
}
};
};
所以我的view.js文件中带有set.getSet()的行给出了关于没有返回创造的承诺。似乎这个脚本仍然是我期望做的,但我不明白为什么我得到警告。
StackTrace:
警告:一个承诺是在一个处理程序中创建的,但没有从它返回
在Object.getSet(C:\dev\infoscrn\ C:\dev\infoscrn\routes\view.js:39:20
在Layer.handle [as handle_request](C :\dev\infoscrn\\\
ode_modules\express\lib\router\layer.js:82:5)
在下一个(C:\dev\infoscrn\\\
ode_modules\express \lib\router\route.js:110:13)
在Route.dispatch(C:\dev\infoscrn\\\
ode_modules\express\lib\router\route.js :91:3)
在Layer.handle [as handle_request](C:\dev\infoscrn\\\
ode_modules\express\lib\router\layer.js:82:5)
在C:\dev\infoscrn\\\
ode_modules\express\lib \\ ruter \index.js:267:22
在param(C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:340:14)
在param(C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:356:14)
在Function.proto.process_params(C:\ dev\infoscrn\\\
ode_modules\express\lib\router\index.js:400:3)
在下一个(C:\dev\infoscrn\\\
ode_modules\express\lib在\router\index.js:261:10)
在Function.proto.handle(C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js: 166:3)
在路由器(C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:35:12)
在Layer.handle [ as handle_request](C:\dev\infoscrn\\\
ode_modules\express\lib\router\layer.js:82:5)
在trim_prefix(C:\dev\infoscrn\\ \
ode_modules\\ express\lib\router\index.js:302:13)
在C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:270: 7
在Function.proto.process_params(C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:321:12)
在下一个(C :\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:261:10)
在C:\dev\infoscrn\\\
ode_modules\express\ lib\router\index.js:603:15
在下一个(C:\dev\infoscrn\\\
ode_modules\express\lib\router\index.js:246:14)
首先,尝试更新所有依赖项。最近有一个版本的Bluebird,它修复了涉及此警告的问题。
接下来,请确保您。
然后,如果您仍然收到警告(像我一样)您可以禁用此特定警告。我选择了在我的环境中设置 BLUEBIRD_W_FORGOTTEN_RETURN = 0
。
I get the warning about not returning a created promise from Bluebird and I do not understand why and how I should rewrite my code.
(I have tried reading about the warning at Bluebird API page and the anti-pattern page as I suspect this is what I'm doing)
In my view.js file:
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;
In my Sets.js file I have:
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
};
});
}
};
};
So the line in my view.js file with "set.getSet()" gives the warning about not returning the created promise. It seems like this script still does what I expect it to do, but I do not understand why I get the warning.
Stacktrace:
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)
First, try and update all your dependencies. There's been a recent version of Bluebird, which fixed an issue involving this warning.
Next, make sure you return from all your handlers.
Then, if you still get the warning (like I do) you can disable this specific warning. I chose to do so by setting BLUEBIRD_W_FORGOTTEN_RETURN=0
in my environment.
这篇关于蓝鸟警告“一个承诺是在一个处理程序中创建的,但没有从它返回”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!