Mongoose关联User/Post/Comment模型报错:ID无法表示Buffer值求助
Hey there, let's figure out why you're hitting that ID cannot represent value: <Buffer ...> error. This issue happens because GraphQL's ID type can't handle the raw Buffer underlying MongoDB's ObjectId directly, and there are a couple of small fixes needed in your code.
1. You're pushing the full Post object to user.posts instead of its ID
In your createPost resolver, you currently have:
user.posts.push(post);
But your User schema defines posts as an array of ObjectIds (referencing Post documents). When you push the entire post object here, Mongoose tries to convert it to an ObjectId, which can result in a Buffer value that GraphQL can't serialize as an ID.
Fix: Push the Post's _id (the actual ObjectId value) instead:
user.posts.push(post._id);
2. Missing resolvers for relational fields
Your type definitions declare relationships (like Post.author returning a User), but you haven't written resolvers to fetch those related documents. Without these resolvers, GraphQL will try to return the raw ObjectId stored in the database—and since that ObjectId is backed by a Buffer, it triggers the serialization error.
Fix: Add resolvers for each relational field to fetch the actual associated documents:
import Users from './models/User'; import Posts from './models/Post'; import Comments from './models/Comment'; export const resolvers = { // Resolvers for relational fields User: { posts: async (parent) => { return await Posts.find({ _id: { $in: parent.posts } }); }, comments: async (parent) => { return await Comments.find({ _id: { $in: parent.comments } }); } }, Post: { author: async (parent) => { return await Users.findById(parent.author); }, comments: async (parent) => { return await Comments.find({ _id: { $in: parent.comments } }); } }, Comment: { author: async (parent) => { return await Users.findById(parent.author); }, post: async (parent) => { return await Posts.findById(parent.post); } }, // Updated Mutation resolvers Mutation: { createUser: async (parent, args, context, info) => { const user = new Users(args); await user.save(); return user; }, createPost: async (parent, { title, body, published, author }, context, info) => { const user = await Users.findById(author); if (!user) { throw new Error("User not found"); // Throw error for client feedback } const post = new Posts({ title, body, published, author: user._id }); await post.save(); user.posts.push(post._id); // Fixed: push Post ID instead of object await user.save(); return post; } } };
3. Bonus: Improve Error Handling
In your original code, you only log "User not found" if the user doesn't exist. Throwing an error instead ensures Apollo Server sends meaningful feedback to the client, making frontend debugging easier.
After applying these changes, your relationships will work as expected, and GraphQL will be able to serialize all ID fields without hitting the Buffer error.
内容的提问来源于stack exchange,提问作者Mj Ebrahimzadeh

