如何从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类型和resolverstype-graphql:结合TypeScript,通过装饰器自动生成GraphQL Schema,同时支持Mongoose集成
内容的提问来源于stack exchange,提问作者reguieg younes
相关产品推荐
相关产品推荐

