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 — 在处理程序中创建了一个承诺,但没有从它返回的主要内容,如果未能解决你的问题,请参考以下文章