如何在 GraphQL 中返回对象或 null?

Posted

技术标签:

【中文标题】如何在 GraphQL 中返回对象或 null?【英文标题】:How to return an object or null in GraphQL? 【发布时间】:2017-10-07 16:01:10 【问题描述】:

我有以下架构:

type User 
    email: String!,
    user_id: String!,
    img: String!,
,

type Query 
    getUser(user_id: String!): User

架构反映了我必须返回一个User 对象的事实。但是,我不能总是这样做,有时我需要返回 null。例如,如果我向数据库发出请求,它将返回返回对象或 null(如果未找到用户)。

在我的 GraphQL 架构中,我为特定字段设置了类型。如果我尝试返回与我设置的类型不同的类型,则会出现错误。如何允许字段返回对象或 null?

【问题讨论】:

如果 DB 给出 null,我只看到一种方法没有返回。 【参考方案1】:

根据spec:

默认情况下,GraphQL 中的所有类型都可以为空; null 值是上述所有类型的有效响应。要声明不允许 null 的类型,可以使用 GraphQL Non-Null 类型。

换句话说,GraphQL 中的类型默认情况下可以为空。所以像

这样的字段
getUser: User

可能返回 User 对象或 null。像

这样的字段
name: String

可能返回一个字符串或空值。只有通过显式将字段指定为非 null(在 SDL 中,通过将 ! 附加到类型),我们才能指定字段永远不应返回 null。例如:

name: String!

还需要注意的是,解析器中返回的 Promise 必须解析为 nullundefined 才能被强制为空值。换句话说,如果您返回一个空对象 ()、一个空数组 ([]) 或其他值,GraphQL 会将其视为您返回一个对象而不是空值!

在您的架构中,User 上的 email 字段为 String!,这意味着它无法解析为 null。如果您运行类似的查询

query 
  getUser(user_id: "1") 
    email
  

getUser 的解析器返回一个空对象 (),GraphQL 将尝试解析 email,为其返回 null 并炸毁,因为 email 不应该为 null!但是,如果 getUser 解析为 null,则不会解析任何子字段,您也不会收到任何错误。

【讨论】:

【参考方案2】:

根据Graphql - get full sub-object, or null if doesn't exist,当您从 GraphQL 函数返回空对象(即 )而不是 null 时,您会收到描述的错误。

我遇到了类似的问题:我一直在 GraphQL 响应中收到“错误:缺少要求字段”错误,直到我确定我实际上返回的是 null,而不是空对象。

【讨论】:

以上是关于如何在 GraphQL 中返回对象或 null?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GraphQL 查询返回 null?

为啥 GraphQL 查询返回 null?

为啥 GraphQL 查询返回 null?

如何在 Graphql 中返回 JSON 对象并定义 JSON 类型

GraphQL 嵌套查询返回 null

在尝试为 neo4j db 仅返回单个对象而不是 graphql 中的数组时获取 null