新建post时如何保存用户文档?
How to save the user document when creating a new post?
所以,我已经解决了之前的问题,只需要用 posts 填充用户文档即可。当前用户文档如下所示:
{
"posts": [],
"_id": "5e75cf827ef14514f69c6714",
"username": "dio",
"email": "dio123@gmail.com",
"password": "b$fwV.KaZG.5tjtmMxQ9NNE.7.XAh6pzLFgf85z9BpPVOgFguR2inGO",
"createdAt": "2020-03-21T08:25:38.459Z",
"updatedAt": "2020-03-21T08:25:38.459Z",
"__v": 0
}
所以,我在创建 post 时这样做了,以便以后可以填充它。
newPost: (req, res) => {
const data = {
title: req.body.title,
content: req.body.content,
user: req.user.userId
}
Post.create(data, (err, newPost) => {
console.log(data, "data")
if (err) {
return res.status(500).json({ error: err })
} else if (!newPost) {
return res.status(400).json({ message: "No Post found" })
} else if (newPost) {
User.findById(req.user.userId, (err, user) => {
user.Posts = user.Posts.concat(newPost._id)
return res.status(200).json({ newPost, user })
})
}
})
}
当我 return 用户从上面的 return 语句执行此操作后,它看起来像这样:
{
posts: [ 5e75d89fa048e321f704453b ],
_id: 5e75cf827ef14514f69c6714,
username: 'dio',
email: 'dio123@gmail.com',
password: 'b$fwV.KaZG.5tjtmMxQ9NNE.7.XAh6pzLFgf85z9BpPVOgFguR2inGO',
createdAt: 2020-03-21T08:25:38.459Z,
updatedAt: 2020-03-21T08:25:38.459Z,
__v: 0
}
每次我创建一个新的 post 时,我都希望 posts 数组包含用户刚刚创建的 posts 的 objectID,但它只是推动最新 post 的 objectId。为什么不记得以前的了?
此外,我想获取用户的 posts:
getUserPosts: async (req, res) => {
try {
const user = await User.findById(req.params.id).populate("posts");
if (!user) {
return res.status(400).json({ error: "No user" });
}
return res.status(200).json({ userPosts: user.posts });
} catch (err) {
return res.status(500).json({ error: "Server error" });
}
}
因为保存在数据库中的用户文档有 post 的空数组,我无法填充它。请帮忙。
将新的post的id添加到用户的posts数组后,需要保存用户:
Post.create(data, (err, newPost) => {
console.log(data, "data");
if (err) {
return res.status(500).json({ error: err });
} else if (!newPost) {
return res.status(400).json({ message: "No Post found" });
} else if (newPost) {
User.findById(req.user.userId, (err, user) => {
user.posts.push(newPost._id);
user
.save()
.then(() => {
return res.status(200).json({ newPost, user });
})
.catch(err => {
return res.status(500).json({ error: err });
console.log(err);
});
});
}
});
我记得在您之前的问题中,posts 的字段名称在用户模式中是 posts
而不是 Posts
,因此以下行也很重要我们使用 push 方法而不是 concat:
user.posts.push(newPost._id);
在此之后,我们只需要使用 save
方法保存用户,因为保存方法 returns 我添加了一个承诺然后捕获块。
SuleymanSah 的回答是正确的。但是,请注意更安全的版本:
User.update(
{ _id: req.user.userId },
{ $push: { userPosts: newPost._id } },
done
);
这背后的原因是在查找和保存之间可能会对用户进行修改,而 $push
是一个原子操作。
所以,我已经解决了之前的问题,只需要用 posts 填充用户文档即可。当前用户文档如下所示:
{
"posts": [],
"_id": "5e75cf827ef14514f69c6714",
"username": "dio",
"email": "dio123@gmail.com",
"password": "b$fwV.KaZG.5tjtmMxQ9NNE.7.XAh6pzLFgf85z9BpPVOgFguR2inGO",
"createdAt": "2020-03-21T08:25:38.459Z",
"updatedAt": "2020-03-21T08:25:38.459Z",
"__v": 0
}
所以,我在创建 post 时这样做了,以便以后可以填充它。
newPost: (req, res) => {
const data = {
title: req.body.title,
content: req.body.content,
user: req.user.userId
}
Post.create(data, (err, newPost) => {
console.log(data, "data")
if (err) {
return res.status(500).json({ error: err })
} else if (!newPost) {
return res.status(400).json({ message: "No Post found" })
} else if (newPost) {
User.findById(req.user.userId, (err, user) => {
user.Posts = user.Posts.concat(newPost._id)
return res.status(200).json({ newPost, user })
})
}
})
}
当我 return 用户从上面的 return 语句执行此操作后,它看起来像这样:
{
posts: [ 5e75d89fa048e321f704453b ],
_id: 5e75cf827ef14514f69c6714,
username: 'dio',
email: 'dio123@gmail.com',
password: 'b$fwV.KaZG.5tjtmMxQ9NNE.7.XAh6pzLFgf85z9BpPVOgFguR2inGO',
createdAt: 2020-03-21T08:25:38.459Z,
updatedAt: 2020-03-21T08:25:38.459Z,
__v: 0
}
每次我创建一个新的 post 时,我都希望 posts 数组包含用户刚刚创建的 posts 的 objectID,但它只是推动最新 post 的 objectId。为什么不记得以前的了?
此外,我想获取用户的 posts:
getUserPosts: async (req, res) => {
try {
const user = await User.findById(req.params.id).populate("posts");
if (!user) {
return res.status(400).json({ error: "No user" });
}
return res.status(200).json({ userPosts: user.posts });
} catch (err) {
return res.status(500).json({ error: "Server error" });
}
}
因为保存在数据库中的用户文档有 post 的空数组,我无法填充它。请帮忙。
将新的post的id添加到用户的posts数组后,需要保存用户:
Post.create(data, (err, newPost) => {
console.log(data, "data");
if (err) {
return res.status(500).json({ error: err });
} else if (!newPost) {
return res.status(400).json({ message: "No Post found" });
} else if (newPost) {
User.findById(req.user.userId, (err, user) => {
user.posts.push(newPost._id);
user
.save()
.then(() => {
return res.status(200).json({ newPost, user });
})
.catch(err => {
return res.status(500).json({ error: err });
console.log(err);
});
});
}
});
我记得在您之前的问题中,posts 的字段名称在用户模式中是 posts
而不是 Posts
,因此以下行也很重要我们使用 push 方法而不是 concat:
user.posts.push(newPost._id);
在此之后,我们只需要使用 save
方法保存用户,因为保存方法 returns 我添加了一个承诺然后捕获块。
SuleymanSah 的回答是正确的。但是,请注意更安全的版本:
User.update(
{ _id: req.user.userId },
{ $push: { userPosts: newPost._id } },
done
);
这背后的原因是在查找和保存之间可能会对用户进行修改,而 $push
是一个原子操作。