Bluebird — 在处理程序中创建了一个承诺,但没有从它返回

Posted

技术标签:

【中文标题】Bluebird — 在处理程序中创建了一个承诺,但没有从它返回【英文标题】:Bluebird — a promise was created in a handler but was not returned from it 【发布时间】:2016-10-18 02:54:21 【问题描述】:

首先,我知道我必须return 承诺避免这个警告。我也尝试按照here in the docs 的建议返回null。考虑这段代码,我在 Mongoose 的 pre-save 钩子中使用它,但我在其他地方遇到过这个警告:

var Story = mongoose.model('Story', StorySchema);

StorySchema.pre('save', function(next) 
    var story = this;

    // Fetch all stories before save to automatically assign
    // some variable, avoiding conflict with other stories
    return Story.find().then(function(stories) 

        // Some code, then set story.somevar value
        story.somevar = somevar;
        return null;
    ).then(next).catch(next); // <-- this line throws warning
);

我也(最初)尝试过这种方式:

        story.somevar = somevar;
        return next(); // <-- this line throws warning
    ).catch(next);

但它也不起作用。哦,我不得不提一下,我使用的是 Bluebird:

var Promise = require('bluebird'),
    mongoose = require('mongoose');

mongoose.Promise = Promise;

不是A promise was created in a handler but was not returned from it的复制品,这家伙忘了返回一个承诺。

【问题讨论】:

Bluebird Unhandled rejection error from successful jquery ajax POST的可能重复 【参考方案1】:

问题几乎完全在于使用next 回调,它调用创建承诺而不返回它们的函数。理想情况下,钩子只需要返回 Promise 而不是回调。

您应该能够通过使用来防止警告

.then(function(result) 
    next(null, result);
    return null;
, function(error) 
    next(error);
    return null;
);

【讨论】:

它有效,谢谢。我进行了一些更改,调用next(error); 将错误进一步传递给处理程序。我不太了解“只需要返回承诺而不是进行回调的钩子”的部分,我可以在哪里阅读?我写的 Node.js + promises 代码越多,我就越理解它:D 我的意思是 mongoose 应该改变它的 API,这样钩子就可以返回一个 Promise 而不必调用 next 回调。

以上是关于Bluebird — 在处理程序中创建了一个承诺,但没有从它返回的主要内容,如果未能解决你的问题,请参考以下文章

Express.js 和 Bluebird - 处理承诺链

NodeJS Bluebird Promise 在处理程序中创建但没有从它返回

NPM CI 和 Bluebird 承诺警告

未处理的承诺拒绝条带支付意图示例

在Bluebird中刷新所有已解决的承诺

像在 Q 中定义空的 Bluebird 承诺