Jho*_*rra 1 mongoose mongodb node.js mongodb-query
我对此有点新鲜,所以如果我在完全错误的轨道上,请随时告诉我.
我有以下帖子架构.
var Post = new Schema( {
description: {
type: String,
default: '',
required: 'Please type a description',
trim: true
},
likeCount: {
type: Number,
default: 0
},
url: {
type: String,
default: '',
required: 'Unable to find photo',
trim: true
},
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User',
required: 'Unable to verify user'
},
comments: {
type: [Comment]
},
//Dynamically added values
hasLiked: {
type: Boolean
}
});
Run Code Online (Sandbox Code Playgroud)
以下是Like schema
var Like = new Schema({
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
post: {
type: Schema.ObjectId,
ref: 'Post'
}
});
Run Code Online (Sandbox Code Playgroud)
当我向用户显示帖子列表时,我需要指出他们之前是否"喜欢"过帖子,所以我试图拉动帖子,然后遍历它们以确定此人是否喜欢它并更新帖子.我没有收到任何错误,但它也没有更新hasLiked值.我将hasLiked值放入我的Mongoose模型中,因为我不能在返回结果之前动态添加值.我没有在DB中存储实际值,因为对于查看帖子的每个人来说显然会有所不同.
exports.list = function(req, res) {
Post.find().sort('-created').populate('user', 'displayName')
.exec(function (err, posts) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
for (var i = 0; i < posts.length; i++) {
Like.find({ 'post': posts[i]._id, 'user': req.user.id }).exec(function (err, like) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
if (like.length == 0)
posts[i].hasLiked = false;
else
posts[i].hasLiked = true;
}
});
}
res.jsonp(posts);
}
});
};
Run Code Online (Sandbox Code Playgroud)
节点是异步语言.所以你的错误在于,当你查询用户是否喜欢这个帖子时:
Like.find({ 'post': posts[i]._id, 'user': req.user.id }).exec(function (err, like)
将答案返回给客户后,答案将返回.换句话说,res.jsonp(posts);在mongo的回答之前执行的行返回并进入回调.这就是为什么它不适合你.
要处理异步方法,我建议您使用第三方库,例如async或q.以下是Q库的一个解决方案:
var Q = require('q');
var promises = [];
posts.forEach(function(post) {
promise = Q(Like.find({ 'post': post._id, 'user': req.user.id }).exec())
.then(
function(like) {
if (like.length == 0)
post.hasLiked = false;
else
post.hasLiked = true;
}
}
,function(err) {
//handle error
});
})
Q.all(promises)
.then(function() {
return res.jsonp(posts);
});
Run Code Online (Sandbox Code Playgroud)