Bluebird - обещание было создано в обработчике, но не было возвращено из него
Прежде всего, я знаю, что я должен return
обещает избежать этого предупреждения. Я также пытался вернуться null
как предложено здесь в документах. Рассмотрим этот фрагмент кода, я использую его в хуке предварительного сохранения Mongoose, но я слышал это предупреждение в других местах:
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;
В обработчике не было создано дубликата " Обещание", но оно не было возвращено, парень забыл вернуть обещание.
1 ответ
Проблема в значительной степени с использованием next
обратный вызов вообще, который вызывает функции, которые создают обещания, не возвращая их. В идеале хуки просто необходимы для возврата обещаний, а не для обратных вызовов.
Вы должны быть в состоянии предотвратить предупреждение, используя
.then(function(result) {
next(null, result);
return null;
}, function(error) {
next(error);
return null;
});