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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:01