GraphQL报错:非空字段Post.title返回null问题求助
核心问题原因
报错Cannot return null for non-nullable field Post.title的本质是GraphQL在解析updatePost mutation返回的Post对象时,发现title字段为null,但你实际数据库更新成功,说明问题出在resolver的返回值处理上,而非数据更新环节。
具体修复步骤
1. 修复异步保存的await缺失
你的代码中post.save()是异步操作,但未使用await,导致resolver返回的是未完成的Promise,而非更新后的完整Post文档。GraphQL虽然支持Promise,但如果未正确等待异步操作完成,可能会读取到旧的文档状态(或未正确解析的Promise对象),导致title字段被判定为null。
修改代码:
post.title = PostInput.title; post.content = PostInput.content; post.imageUrl = PostInput.imageUrl; const result = await post.save(); // 添加await return result;
2. 对齐Schema字段约束
注意到你的Schema中存在字段约束不一致:
Post类型的imageUrl是非空约束(String!)- 但
PostInput中的imageUrl是可选字段(String)
这会导致如果更新时未传入imageUrl,数据库中该字段会被设为null,直接违反Post类型的非空约束。建议统一约束:
要么将PostInput的imageUrl改为非空:
input PostInput { title: String! content: String! imageUrl: String! # 添加! }
要么将Post类型的imageUrl改为可选:
type Post { _id: ID! title: String! content: String! imageUrl: String # 去掉! creator: User! createdAt: String! updatedAt: String! }
3. 验证返回的Post文档完整性
确保从数据库查询待更新的post对象时,没有排除title字段(比如使用select('-title')这类查询选项),同时更新后返回的文档包含所有Post类型要求的非空字段(尤其是creator字段,需确保已关联查询到完整的User对象,否则后续可能触发新的非空报错)。
额外说明
你之前处理[object null prototype]的方法JSON.parse(JSON.stringify(PostInput))是有效的,当前PostInput的结构也符合预期,因此该环节不是报错原因。
内容的提问来源于stack exchange,提问作者yonatan Cohen

