2016-06-16 22 views
2

首先,我知道我必須return承諾避免此警告。我也嘗試按照建議的here in the docs返回null。考慮這段代碼,我使用它在貓鼬的預存掛鉤,但我已經經歷了在其他地方這樣的警告:藍鳥 - 一個承諾是在處理程序中創建的,但沒有從它返回

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); 

但它也不起作用。哦,我不得不提,那我用藍鳥:

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

mongoose.Promise = Promise; 

不是A promise was created in a handler but was not returned from it重複,那傢伙忘記返回一個承諾。

+0

[從成功的jQuery AJAX POST藍鳥未處理的廢品(的可能的複製http://stackoverflow.com/questions/33948597/bluebird-unhandled防止警告-rejection-error-from-successful-jquery-ajax-post) – TylerH

回答

3

問題幾乎全是使用next回調函數,它調用創建promise而不返回它們的函數。理想情況下,鉤子只需要返回承諾而不是回調。

您應該能夠通過使用

.then(function(result) { 
    next(null, result); 
    return null; 
}, function(error) { 
    next(error); 
    return null; 
}); 
+0

它的工作原理,謝謝。我改變了一下來調用'next(error);'將錯誤進一步傳遞給處理程序。我並不完全瞭解「鉤子只是回覆承諾而不是回調」,我可以在哪裏閱讀?我寫的越多,Node.js +承諾的代碼越少,我理解它:D –

+0

我的意思是貓鼬應該改變它的API,以便鉤子可以只是返回一個承諾,而不必調用「下一個」回調。 – Bergi

相關問題