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

如何从Mongoose模型构建GraphQL?及GraphQL向MongoDB插入嵌套对象时的错误求助

解决嵌套结构GraphQL输入类型错误及Mongoose模型映射问题

我看到你遇到的问题是GraphQL输入类型不匹配的错误,这是因为在定义输入对象InputLocation时,你错误地使用了输出类型(LocationName、LocationMap),而GraphQL要求输入参数必须使用专门的输入类型(你已经定义了InputLocationName和InputLocationMap,但没正确引用)。另外还有几处小细节需要调整,下面一步步解决:

1. 修正GraphQL Schema中的输入类型引用

你的InputLocation定义里,locationName和locationMap应该使用对应的输入类型,而不是输出类型。修改后的Schema片段如下:

input InputLocation{
  locationName:[InputLocationName!]!  # 替换为输入类型InputLocationName
  locationType:String!
  imageUrl:[String!]
  locationMap:InputLocationMap!      # 替换为输入类型InputLocationMap
}

2. 修正Resolver中的字段大小写错误

在createLocation resolver里,你访问输入参数时用了大写开头的LocationName和LocationMap,但实际GraphQL传递的参数是小写开头的locationName和locationMap,这会导致数据无法正确传递给Mongoose模型。修正后的resolver代码:

createLocation:(args)=>{
  return User.findOne({_id:"6002cff9d32ceb25ac9e9c7e"})
  .then(user=>{
    if (!user) {
      throw new Error('User dont found.')
    } else{
      const location=new Location(
        {
          locationName:args.inputLocation.locationName,  # 修正字段大小写
          locationType:args.inputLocation.locationType,
          imageUrl:args.inputLocation.imageUrl,
          locationMap:args.inputLocation.locationMap,    # 修正字段大小写
          owner:"6002cff9d32ceb25ac9e9c7e"
        }
      );
      return location
      .save()
      .then(result=>{
        console.log(result)
        return result
      })
      .catch((err)=>{
        throw err;
      })
    }
  })
},

3. 修正Mutation查询中的多余字段

你执行的mutation里locationName数组里多了一个isShow:true字段,但你的Mongoose模型和GraphQL Schema里都没有定义这个字段,需要删除它,否则会导致数据校验失败。修正后的查询:

mutation{
  createLocation(inputLocation:{
    locationName:[{lang:"en",text:"sad"}],  # 移除未定义的isShow字段
    locationType:"clinic",
    imageUrl:["/images/01.png"],
    locationMap:{
      type:"Point",
      coordinates:[2342342,2342345]
    }
  }) {
    _id
  }
}

关于从Mongoose模型构建GraphQL的小建议

如果你不想手动重复定义GraphQL类型和Mongoose模型,可以考虑使用一些工具来自动生成,减少重复劳动和人为错误:

  • graphql-compose-mongoose:可以直接从Mongoose Schema生成GraphQL类型和resolvers
  • type-graphql:结合TypeScript,通过装饰器自动生成GraphQL Schema,同时支持Mongoose集成

内容的提问来源于stack exchange,提问作者reguieg younes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:37:46