首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切换到GraphQL15.5.1返回空数组后,将导致“无法返回空值”错误

切换到GraphQL15.5.1返回空数组后,将导致“无法返回空值”错误
EN

Stack Overflow用户
提问于 2021-07-19 09:14:56
回答 1查看 377关注 0票数 1

编辑:您可以跳到末尾,以获得代码框中错误的简化示例。

我正在将我的阿波罗计划升级到新版本的graphql,我得到了一个奇怪的错误。在google上找不到任何与此场景相匹配的结果。当我试图返回具有非空字段(包括day)的ObjectTypes DrivingActivitiesDailySummaryType的空数组时,它会抛出一个“非空字段DrivingActivitiesDailySummaryType.day不能返回null”。这在14.7.0版中起了作用。这里发生了什么事?如何避免呢?我认为正常的行为是允许空数组,并且在changelog中找不到任何指示这种类型更改的东西。

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

代码语言:javascript
复制
@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: [],
        }
    }

我的有效载荷分配:

代码语言:javascript
复制
@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错误:

代码语言:javascript
复制
  "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设计(尽管这并不重要):

代码语言:javascript
复制
@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”),当使用提供的package.json (有新版本)时,错误会被再现,当您用Pack-old.json切换package.json的内容时-old.json( graphql和type-graphql的旧版本)没有错误。

EDIT2:您可能需要将"/graphql“添加到代码框链接中才能正常工作

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-19 15:13:51

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

代码语言:javascript
复制
@Field(() => [DrivingActivitiesDailySummaryType])
public dailySummaries: DrivingActivitiesDailySummaryType[]

@Field(() => [DrivingActivitiesMonthlySummaryType])
public monthlySummaries: DrivingActivitiesMonthlySummaryType[]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68437977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档