如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章