gpt4 book ai didi

node.js - 迭代 Mongoose 结果来更新值

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:51 24 4
gpt4 key购买 nike

我对此有些陌生,所以如果我走错了路,请随时告诉我。

我有以下帖子架构。

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

以及以下 Like 架构

var Like = new Schema({
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
post: {
type: Schema.ObjectId,
ref: 'Post'
}
});

当我向用户显示帖子列表时,我需要表明他们之前是否“喜欢”过某个帖子,因此我尝试提取这些帖子,然后迭代它们以确定该人是否喜欢该帖子并更新邮政中的值(value)。我没有收到任何错误,但它也没有更新 hasLiked 值。我将 hasLiked 值放入我的 Mongoose 模型中,因为我不能在返回结果之前动态添加值。我不会在数据库中存储该值的实际值,因为对于每个查看该帖子的人来说,它显然都是不同的。

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

最佳答案

Node 是异步语言。所以你的错误是,当你查询用户是否喜欢该帖子时:

Like.find({ 'post': posts[i]._id, 'user': req.user.id }).exec(function (err, like)

将答案返回给客户端之后。换句话说,行 res.jsonp(posts); 在 mongo 的答案返回并进入回调之前执行。这就是为什么它不适合你。

要处理异步方法,我建议您使用第三方库,例如asyncq 。这是使用 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);
});

关于node.js - 迭代 Mongoose 结果来更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com