如何将GraphQL中Event的Category数组转为单个对象?
解决GraphQL中Event分类从数组转为单个对象的问题
要实现你想要的结果,需要从Schema定义和Resolver逻辑两方面修改:
1. 修改GraphQL Schema
首先把Event类型里的category从数组类型改成单个Category类型(如果每个Event必然有分类,保留!标记非空;如果允许无分类,去掉!):
type Event { _id: String! name: String! category: Category! # 去掉数组包裹,定义为单个分类对象 }
2. 修改Resolver代码
原来的Resolver用filter返回的是数组,现在要改成直接返回单个分类对象,同时优化查询逻辑(没必要查询所有分类再过滤,直接根据ID查询更高效):
export const Event = { category: async (parent, args, context, info) => { // 若parent.category存储的是单个分类ID,直接查单个文档 return await Category.findById(parent.category); // 如果你之前parent.category是数组格式(比如[分类ID]),则取第一个元素: // return await Category.findById(parent.category[0]); } }
为什么你之前的方法没用?
你尝试的return { ...category }本质是把数组展开成带索引的对象(比如{0: 分类对象}),但一方面这个结构和Schema定义的数组类型不匹配,另一方面GraphQL会严格按照Schema的类型返回结果——只要Schema定义的是数组,哪怕你返回单个对象,它也会自动包裹成数组。必须先修改Schema的类型定义,再让Resolver返回对应类型的单个对象,才能得到你想要的格式。
内容的提问来源于stack exchange,提问作者Caillou
相关产品推荐
相关产品推荐

