Mongoose查询Proposal时_id路径ObjectId转换错误,GraphQL resolver已校验ID有效
报错原因
- 错误使用Mongoose的
findById方法:findById仅接收字符串/ObjectId类型的_id值作为入参,你传入了{ proposser: 'xxx' }对象,Mongoose会将整个传入对象尝试转换为_id对应的ObjectId类型,因此触发类型转换报错。 - Mongoose模型字段缺失:你的
ProposalSchema中没有定义proposser字段,即使后续用正确的查询方法也无法匹配到对应数据。
解决方法
1. 修正模型定义
补全proposser字段,可删除冗余的_id声明(Mongoose会自动维护_id字段):
const ProposalSchema = new Schema({ coverLetter: { type: String, }, budget: { type: String, }, // 补全proposser字段 proposser: { type: mongoose.Schema.Types.ObjectId, required: true }, }); const Proposal = mongoose.model("Proposal", ProposalSchema);
2. 修正Resolver查询逻辑
如果你是要根据proposser字段查询对应Proposal,应该使用findOne或者find方法,而不是findById:
Query: { // 单个proposser对应多个Proposal的场景用find proposals(_, args) { const { proposser } = args; if (!mongoose.isValidObjectId(proposser)) { throw new Error('非法的proposser ID格式') } return Proposal.find({ proposser }); }, // 单个proposser仅对应一个Proposal的场景用findOne proposal(_, args) { const { proposser } = args; if (!mongoose.isValidObjectId(proposser)) { throw new Error('非法的proposser ID格式') } return Proposal.findOne({ proposser }); } }
3. 可选适配场景
如果你的业务逻辑就是要查询_id匹配的Proposal,直接给findById传ID值即可:
Query: { proposal(_, args) { const { id } = args; if (!mongoose.isValidObjectId(id)) { throw new Error('非法的ID格式') } return Proposal.findById(id); }, }
内容的提问来源于stack exchange,提问作者Hussam Khatib
相关产品推荐
相关产品推荐

