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;
});
Другие вопросы по тегам