React项目中GraphQL多计数查询的类型错误问题求助
解决GraphQL返回类型不匹配的错误
你遇到的这个错误核心原因很清晰:你定义的查询返回类型是单个GraphQLInt,但resolve函数实际返回的是包含两个数字字段的对象,GraphQL尝试把对象转换成Int类型,自然就抛出了类型不兼容的错误。
正确的解决方案:创建自定义对象类型
因为你需要返回多个计数结果,不能直接用GraphQLInt作为返回类型,得定义一个符合返回结构的自定义GraphQLObjectType。
修改后的代码如下:
import { GraphQLInt, GraphQLNonNull, GraphQLObjectType } from 'graphql' import * as moment from 'moment' import orm from '../../orm' import authDecorator from '../helpers/auth-decorator' interface IQueryMissionCountArgs { authToken: string } // 定义自定义返回类型,匹配resolve返回的结构 const MissionCountType = new GraphQLObjectType({ name: 'MissionCount', fields: () => ({ lastWeekPostedMissions: { type: new GraphQLNonNull(GraphQLInt) }, lastWeekAcceptedMissions: { type: new GraphQLNonNull(GraphQLInt) } }) }) export default authDecorator({ requireAdmin: true, requireAuth: true })({ // 这里使用自定义的MissionCountType作为返回类型 type: MissionCountType, async resolve (args: IQueryMissionCountArgs) { const lastWeekAcceptedMissionsCount = await orm.models.Mission.count({ where: { createdAt: { $between: [moment().subtract(7, 'days').toDate(), new Date()] }, status: 'accepted' } }) const lastWeekPostedMissionsCount = await orm.models.Mission.count({ where: { createdAt: { $between: [moment().subtract(7, 'days').toDate(), new Date()] } } }) return { lastWeekPostedMissions: lastWeekPostedMissionsCount, lastWeekAcceptedMissions: lastWeekAcceptedMissionsCount, } } })
关键修改点说明:
- 导入
GraphQLObjectType来创建自定义类型 - 定义
MissionCountType,它的字段和你resolve返回的对象结构完全对应,每个字段都设置为非空的GraphQLInt - 将查询的
type属性替换为这个自定义类型,这样GraphQL就能正确识别返回的对象结构,不会再出现类型不匹配的错误
内容的提问来源于stack exchange,提问作者Chaibi Alaa
相关产品推荐
相关产品推荐

