GraphQL:返回具有不可为空 id 字段的类型作为查询结果

Posted

技术标签:

【中文标题】GraphQL:返回具有不可为空 id 字段的类型作为查询结果【英文标题】:GraphQL: Return a type with non-nullable id field as a query result 【发布时间】:2018-12-19 14:13:37 【问题描述】:

我有这种类型:

  type Profile 
    id: ID! @isUnique
    email: String! @isUnique
    ...
  

还有一个查询:

profile(email: String!):Profile

当我使用不存在的用户运行查询时,我的底层解析器返回 null,我希望 GraphQL 会喜欢这个。

但是,我得到了这个错误:

Cannot return null for non-nullable field Profile.id.

发生这种情况是因为查询应该返回 Profile 并且 Profile 必须有 id 字段。

但是,查询的返回类型不是不可为空的Profile!,而是Profile,这意味着查询可能什么也不返回。

如何正确解决这个问题?

【问题讨论】:

您能否更新您的问题以包含来自 GraphQL 的完整响应,而不仅仅是错误? 我也有同样的问题,这里有我的完整回复justpaste.it/4pqlr 【参考方案1】:

尝试在您的个人资料查询解析器中返回 null。如果您返回类似空对象的内容,Profile 解析器将拾取该对象并尝试将 undefined 返回为 Profile.id,正如您所指出的那样,这是一个架构错误。

试试这样的:

const queryProfileResolver = (_,  email ) => 
  // getProfileByEmail should return null if no match is found
  return getProfileByEmail(email)

您的 graphQL 响应将如下所示


  data: 
    profile: null
  

【讨论】:

同样的问题,没有解决办法:(【参考方案2】:

首先你需要删除你的数据库并使用 types.graphql 原样

type Profile 
    id: ID! @isUnique
    email: String! @isUnique 
    ...
  

部署它,错误就会消失。

发生这种情况的主要原因是您已经部署了不为空的数据,因此无法更改您需要删除我们的数据库,就是这样

【讨论】:

以上是关于GraphQL:返回具有不可为空 id 字段的类型作为查询结果的主要内容,如果未能解决你的问题,请参考以下文章

Schema graphql 错误给出“不能为不可为空的字段 Organisation.id 返回 null”为啥?

GraphQL 查询返回错误“不能为不可为空的字段返回 null”

使用 Graphql 在 NestJS 上订阅时,“不能为不可为空的字段返回 null”

Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”

错误:使用 Graphql 在 Spring Boot 中不可为空的类型是“ID”

GraphQL SDL(aws appsync)中的“不能为不可为空的类型返回 null:父“消息”(/getMessages/sendBy)中的“人”