问题
I'm trying to get a particular user's posts. It's returning me an empty array of posts. Here's my code. I think I have referenced everything correctly, there must be some mistake.
User model
const Schema = mongoose.Schema
const userSchema = new Schema({
username: { type: String, required: true },
email: { type: String, reuired: true },
password: { type: String, required: true },
posts:[{ type: Schema.Types.ObjectId, ref: "Post" }]
}, { timestamps: true })
Post model
const Schema = mongoose.Schema;
const postSchema = new Schema({
title: { type: String, required: true },
content: { type: String, required: true },
user: { type: Schema.Types.ObjectId, ref: "User" },
}, { timestamps: true }
router.get("/posts/:id", usersController.getUserPosts)
getUserPosts: (req, res) => {
User.findById(req.params.id, async (err, user) => {
if (err) {
return res.status(500).json({ error: "Server error" })
} else if (!user) {
return res.status(400).json({ error: "No user" })
} else if (user) {
user = await User.populate("user", {
path: "posts",
model: "Post"
})
return res.status(200).json({ user })
}
})
}
Edit
The users in the database are:
/users/list
{
"users": [
{
"posts": [],
"_id": "5e66496fcaf5d6697ca3fdbc",
"username": "JimmyPage",
"email": "jimmypage@gmail.com",
"password": "$2b$10$mu0IcHADj5YVIT/66EEfPOxL3cvEjqDsnJUcrST8ZcatTOcQ42kn6",
"createdAt": "2020-03-09T13:49:35.834Z",
"updatedAt": "2020-03-09T13:49:35.834Z",
"__v": 0
},
{
"posts": [],
"_id": "5e66499fcaf5d6697ca3fdbe",
"username": "AxlRose",
"email": "axlrose@gmail.com",
"password": "$2b$10$H3X3efz02RonlvNXaRPr2eEbflSiFK1ITFdbyT2igUGDK9gDpIJqO",
"createdAt": "2020-03-09T13:50:23.702Z",
"updatedAt": "2020-03-09T13:50:23.702Z",
"__v": 0
}
]
}
The posts look like this:
/posts/list
{
"posts": [
{
"_id": "5e66498ccaf5d6697ca3fdbd",
"title": "Jimmy Page's post",
"description": "This is Jimmy Page's post",
"user": {
"posts": [],
"_id": "5e66496fcaf5d6697ca3fdbc",
"username": "JimmyPage",
"email": "jimmypage@gmail.com",
"password": "$2b$10$mu0IcHADj5YVIT/66EEfPOxL3cvEjqDsnJUcrST8ZcatTOcQ42kn6",
"createdAt": "2020-03-09T13:49:35.834Z",
"updatedAt": "2020-03-09T13:49:35.834Z",
"__v": 0
},
"createdAt": "2020-03-09T13:50:04.840Z",
"updatedAt": "2020-03-09T13:50:04.840Z",
"__v": 0
},
{
"_id": "5e6649b5caf5d6697ca3fdbf",
"title": "Axl Rose's Post",
"description": "This is Axl Rose's Post",
"user": {
"posts": [],
"_id": "5e66499fcaf5d6697ca3fdbe",
"username": "AxlRose",
"email": "axlrose@gmail.com",
"password": "$2b$10$H3X3efz02RonlvNXaRPr2eEbflSiFK1ITFdbyT2igUGDK9gDpIJqO",
"createdAt": "2020-03-09T13:50:23.702Z",
"updatedAt": "2020-03-09T13:50:23.702Z",
"__v": 0
},
"createdAt": "2020-03-09T13:50:45.751Z",
"updatedAt": "2020-03-09T13:50:45.751Z",
"__v": 0
},
{
"_id": "5e664b7bf120ab6c0d9999c9",
"title": "Jimmy Page's second post",
"description": "This is Jimmy Page's second post\n\n",
"user": {
"posts": [],
"_id": "5e66496fcaf5d6697ca3fdbc",
"username": "JimmyPage",
"email": "jimmypage@gmail.com",
"password": "$2b$10$mu0IcHADj5YVIT/66EEfPOxL3cvEjqDsnJUcrST8ZcatTOcQ42kn6",
"createdAt": "2020-03-09T13:49:35.834Z",
"updatedAt": "2020-03-09T13:49:35.834Z",
"__v": 0
},
"createdAt": "2020-03-09T13:58:19.261Z",
"updatedAt": "2020-03-09T13:58:19.261Z",
"__v": 0
}
]
}
I've added the above code in my question. I've been stuck in this like forever like I'm trying to show user's posts in his profile and also planning to show the global feed of all user's posts showing.
It will be great if you could help me out. I will really appreciate it. THANKS.
List posts controller is like this:
listposts: (req, res) => {
Post.find({}, async (error, posts) => {
if (error) {
return res.status(500).json({ error: "something went wrong" })
} else if (!posts) {
return res.status(400).json({ msg: "sorry no posts" })
} else if (posts) {
posts = await Post.populate(posts, {
path: 'user',
model: 'User'
});
return res.status(200).json({ posts })
}
})
}
The users document:
{
"_id" : ObjectId("5e66496fcaf5d6697ca3fdbc"),
"posts" : [ ],
"username" : "JimmyPage",
"email" : "jimmypage@gmail.com",
"password" : "$2b$10$mu0IcHADj5YVIT/66EEfPOxL3cvEjqDsnJUcrST8ZcatTOcQ42kn6",
"createdAt" : ISODate("2020-03-09T13:49:35.834Z"),
"updatedAt" : ISODate("2020-03-09T13:49:35.834Z"), "__v" : 0
}
{
"_id" : ObjectId("5e66499fcaf5d6697ca3fdbe"),
"posts" : [ ],
"username" : "AxlRose",
"email" : "axlrose@gmail.com",
"password" : "$2b$10$H3X3efz02RonlvNXaRPr2eEbflSiFK1ITFdbyT2igUGDK9gDpIJqO",
"createdAt" : ISODate("2020-03-09T13:50:23.702Z"),
"updatedAt" : ISODate("2020-03-09T13:50:23.702Z"),
"__v" : 0
}
And the posts document:
{
"_id" : ObjectId("5e66498ccaf5d6697ca3fdbd"),
"title" : "Jimmy Page's post",
"description" : "This is Jimmy Page's post",
"user" : ObjectId("5e66496fcaf5d6697ca3fdbc"),
"createdAt" : ISODate("2020-03-09T13:50:04.840Z"),
"updatedAt" : ISODate("2020-03-09T13:50:04.840Z"),
"__v" : 0
}
{
"_id" : ObjectId("5e6649b5caf5d6697ca3fdbf"),
"title" : "Axl Rose's Post",
"description" : "This is Axl Rose's Post",
"user" : ObjectId("5e66499fcaf5d6697ca3fdbe"),
"createdAt" : ISODate("2020-03-09T13:50:45.751Z"),
"updatedAt" : ISODate("2020-03-09T13:50:45.751Z"),
"__v" : 0 }
{
"_id" : ObjectId("5e664b7bf120ab6c0d9999c9"),
"title" : "Jimmy Page's second post",
"description" : "This is Jimmy Page's second post\n\n",
"user" : ObjectId("5e66496fcaf5d6697ca3fdbc"),
"createdAt" : ISODate("2020-03-09T13:58:19.261Z"),
"updatedAt" : ISODate("2020-03-09T13:58:19.261Z"),
"__v" : 0
}
回答1:
You can use the following method to get the user info and his/her 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({ user });
} catch (err) {
return res.status(500).json({ error: "Server error" });
}
};
来源:https://stackoverflow.com/questions/60606546/returning-an-empty-array-of-posts-when-using-mongoose-populate