蓝鸟警告“一个承诺是在一个处理程序中创build的,但没有从它返回”

我得到了关于不从蓝鸟返回创build的承诺的警告,我不明白为什么以及如何重写我的代码。

(我曾尝试阅读关于Bluebird API页面和反模式页面的警告,因为我怀疑这是我正在做的)

在我的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()”行提供了关于不返回创build的承诺的警告。 看起来这个剧本还在做我期望的function,但我不明白为什么我会收到警告。

堆栈跟踪:

 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) 

首先,尝试更新所有的依赖关系 。 最近有一个蓝鸟版本,它修复了一个涉及这个警告的问题 。

接下来,确保你从所有的处理程序返回 。

然后,如果你仍然得到警告(就像我这样做),你可以禁用这个特定的警告 。 我select了在我的环境中设置BLUEBIRD_W_FORGOTTEN_RETURN=0

不要禁用警告。 他们在那里是有原因的。

典型的模式是,如果你的onfulfill或onreject处理程序导致一个Promise被构造,它将从处理程序返回Promise(或从它派生的某个链),以便链条采用该Promise的状态。

所以Bluebird正在跟踪它何时运行你的处理函数,并跟踪它的Promise构造函数何时被调用。 如果它确定在你的处理程序正在运行的任何时候 (包括callstack中的任何地方)创build了一个Promise,但是那个Promise 没有从你的处理程序返回,它会发出这个警告,因为它认为你可能了写回车声明。

所以,如果你合理地不在乎在处理程序中创build的Promise,你所要做的就是显式地从你的处理程序中返回一些东西。 如果你不关心从你的处理程序返回的是什么(即,如果你不在乎Promise满足什么价值),那么简单地返回null 。 无论你回报什么,明确的回报(具体来说,除了undefined的返回值)告诉蓝鸟,你认为你知道你在做什么,它不会发出这个警告。