Node.js 蓝鸟承诺在快车/猫鼬中过早返回
我对承诺不熟悉,不知道为什么下面的方法不起作用。我之所以这样假设,是因为我需要用一种特定的方式设置我的自定义方法来处理承诺 我用蓝鸟作为我的承诺图书馆。我试图通过在这些模型(即讨论和用户模型)上使用mongoose静态和方法,获得给定“用户”用户名的“讨论”对象列表 下面是我在Express中的请求处理程序。现在只是尝试获取JSON并将其作为响应发送:Node.js 蓝鸟承诺在快车/猫鼬中过早返回,node.js,express,mongoose,promise,bluebird,Node.js,Express,Mongoose,Promise,Bluebird,我对承诺不熟悉,不知道为什么下面的方法不起作用。我之所以这样假设,是因为我需要用一种特定的方式设置我的自定义方法来处理承诺 我用蓝鸟作为我的承诺图书馆。我试图通过在这些模型(即讨论和用户模型)上使用mongoose静态和方法,获得给定“用户”用户名的“讨论”对象列表 下面是我在Express中的请求处理程序。现在只是尝试获取JSON并将其作为响应发送: /* /routes/users.js */ var Promise = require('bluebird'); var User = re
/* /routes/users.js */
var Promise = require('bluebird');
var User = require('../models/').User
/* ... express inclusions, other routes ... */
/* Get list of discussions for user */
router.get('/:username/discussions', function(req, res) {
User.findOne({username: req.params.username}).then(function(user) {
if (user) {
return user.getDiscussions();
} else {
res.send('no user found');
}
}).then(function(discussions) {
res.send(discussions);
}).catch(function(error) {
console.log('ERROR: ' + error);
res.send('ERROR: ' + error);
});
});
下面是user.getDiscussions():
最后是Discussion.getDiscussionsForUser:
/* /models/discussion.js */
var Promise = require('bluebird');
var mongoose = Promise.promisifyAll(require('mongoose'));
var Schema = mongoose.Schema;
/* ... DiscussionSchema defined here ... */
DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
var self = this;
self.model('User').findOne({username: username}, 'discussions').then(function(user) {
if (!user) {
return Promise.reject('User with username \'' + username + '\' does not exist.');
} else {
var discussions = [];
return self.model('Discussion').find({
'_id': { $in : user.discussions }
});
}
});
});
路由中的请求似乎提前完成,并在响应中发送未定义的请求。你知道为什么在讨论模型中从Mongoose获得的讨论没有出现在路线上吗?getDiscussions()
和getDiscussionsForUser()
没有正确地返回承诺。更改如下:
UserSchema.methods.getDiscussions = Promise.method(function() {
var self = this;
// *** added a return to this next line
return self.model('User').findById(self.id).then(function(user) {
if (!user) {
// *** added a return to this next line
return Promise.reject('User \'' + self.id + '\' does not exist.');
} else {
return Discussion.getDiscussionsForUser(self.username);
}
});
});
与getDiscussionsForUser()
相同,应该是:
DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
var self = this;
// *** added a return to the next line
return self.model('User').findOne({username: username}, 'discussions').then(function(user) {
if (!user) {
return Promise.reject('User with username \'' + username + '\' does not exist.');
} else {
var discussions = [];
return self.model('Discussion').find({
'_id': { $in : user.discussions }
});
}
});
});
为了使调用方能够使用承诺协调函数内异步操作的完成,通过函数的所有代码路径必须始终从该函数返回承诺。一旦进入
.then()
处理程序,如果存在进一步的嵌套异步操作,则必须返回一个承诺,或者如果希望该值成为所处承诺的值,则可以只返回一个值。Doh!谢谢我已经看了一段时间了,但是在最初找到用户之后,我太专注于每个函数的内部工作。
DiscussionSchema.statics.getDiscussionsForUser = Promise.method(function(username) {
var self = this;
// *** added a return to the next line
return self.model('User').findOne({username: username}, 'discussions').then(function(user) {
if (!user) {
return Promise.reject('User with username \'' + username + '\' does not exist.');
} else {
var discussions = [];
return self.model('Discussion').find({
'_id': { $in : user.discussions }
});
}
});
});