如何在 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 必须解析为 null
或 undefined
才能被强制为空值。换句话说,如果您返回一个空对象 ()、一个空数组 (
[]
) 或其他值,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?的主要内容,如果未能解决你的问题,请参考以下文章