【问题标题】:After switchinng to graphql 15.5.1 returning an empty array results in a "cannot return null value" error切换到 graphql 15.5.1 后返回空数组会导致“无法返回空值”错误
【发布时间】:2021-09-26 23:14:51
【问题描述】:

编辑:您可以跳到最后查看代码和框中错误的简化示例

我正在将我的 apollo 项目升级到新版本的 graphql,但我遇到了一个奇怪的错误。在 google 上找不到与此方案匹配的任何结果。当我尝试返回具有不可为空字段(包括日期)的 ObjectTypes DrivingActivitiesDailySummaryType 的空数组时,它会抛出“不能为不可为空的字段 DrivingActivitiesDailySummaryType.day 返回 null。”。这在版本 14.7.0 中按预期工作。这里发生了什么事?如何避免?我认为正常的行为是允许空数组,我在更改日志中找不到任何表明这种类型更改的内容。

我的解析器目前只返回一个硬编码值用于测试:

@Query(() => DrivingActivityPayload)
    public async totalDrivingActivity(
        @Ctx("user") userContext: UserContext,
        @Args() input: DrivingActivitiesQueryInput
    ): Promise<DrivingActivityPayload> {
        return {
            totalSummary: { speed: 1, activities: 1, duration: 1, distance: 1 },
            dailySummaries: [],
            monthlySummaries: [],
        }
    }

我的有效载荷定义:

@ObjectType()
export class DrivingActivityPayload {
    @Field(() => DrivingActivitiesTotalSummaryType)
    public totalSummary: DrivingActivitiesTotalSummaryType

    @Field(() => DrivingActivitiesDailySummaryType)
    public dailySummaries: DrivingActivitiesDailySummaryType[]

    @Field(() => DrivingActivitiesMonthlySummaryType)
    public monthlySummaries: DrivingActivitiesMonthlySummaryType[]

    constructor(
        totalSummary: DrivingActivitiesTotalSummaryType,
        dailySummaries: DrivingActivitiesDailySummaryType[],
        monthlySummaries: DrivingActivitiesMonthlySummaryType[]
    ) {
        this.totalSummary = new DrivingActivitiesTotalSummaryType(totalSummary)
        this.dailySummaries = dailySummaries.map(summary => new DrivingActivitiesDailySummaryType(summary))
        this.monthlySummaries = monthlySummaries.map(summary => new DrivingActivitiesMonthlySummaryType(summary))
    }
}

GraphQL 错误:

  "errors": [
    {
      "message": "Cannot return null for non-nullable field DrivingActivitiesDailySummaryType.day.",
      "locations": [
        {
          "line": 18,
          "column": 7
        }
      ],
      "path": [
        "totalDrivingActivity",
        "dailySummaries",
        "day"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "stacktrace": [
            "Error: Cannot return null for non-nullable field DrivingActivitiesDailySummaryType.day.",
            "    at completeValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:559:13)",
            "    at resolveField ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:472:19)",
            "    at executeFields ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:292:18)",
            "    at collectAndExecuteSubfields ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:748:10)",
            "    at completeObjectValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:738:10)",
            "    at completeValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:590:12)",
            "    at completeValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:556:21)",
            "    at resolveField ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:472:19)",
            "    at executeFields ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:292:18)",
            "    at collectAndExecuteSubfields ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:748:10)",
            "    at completeObjectValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:738:10)",
            "    at completeValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:590:12)",
            "    at completeValue ([PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:556:21)",
            "    at [PROJECT-FOLDER]/node_modules/graphql/execution/execute.js:469:16",
            "    at processTicksAndRejections (node:internal/process/task_queues:96:5)",
            "    at async Promise.all (index 0)"
          ]
        }
      }
    }
  ],
  "data": null
}

DrivingActivitiesDailySummaryType 定义(尽管这无关紧要):

@ObjectType()
export class DrivingActivitiesDailySummaryType {
    @Field(() => Date)
    public day: Date

    @Field()
    public distance: number

    @Field()
    public activities: number

    constructor(summary: DrivingActivitiesDailySummaryType) {
        this.day = summary.day
        this.activities = summary.activities
        this.distance = summary.distance
    }
}

编辑:这是一个带有重现错误的沙盒链接: https://codesandbox.io/s/heuristic-jepsen-5frr3?file=/package.json (我不知道如何更改默认终端行为,因此您必须使用“+”图标打开一个新终端并运行“npm start”) 使用提供的 package.json(带有新版本)时,会重现错误,当您使用 package-old.json(旧版本的 graphql 和 type-graphql)切换 package.json 的内容时,不会出现错误。

EDIT2:您可能需要将“/graphql”添加到代码框链接才能使其工作

【问题讨论】:

    标签: graphql apollo typegraphql


    【解决方案1】:

    您应该将每日和每月摘要定义为数组:

    @Field(() => [DrivingActivitiesDailySummaryType])
    public dailySummaries: DrivingActivitiesDailySummaryType[]
    
    @Field(() => [DrivingActivitiesMonthlySummaryType])
    public monthlySummaries: DrivingActivitiesMonthlySummaryType[]
    

    【讨论】:

    • 这解决了它,甚至不知道这是一个选项^^
    猜你喜欢
    • 2018-08-31
    • 2023-02-18
    • 1970-01-01
    • 2014-09-11
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2021-05-21
    相关资源
    最近更新 更多