You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:15:03