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

时间:2017-05-09 11:06:27

标签: graphql

我有以下架构:

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

type Query {
    getUser(user_id: String!): User
}

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

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

3 个答案:

答案 0 :(得分:1)

您可以定义可以为空的GraphQL类型。

请查看此cheat sheet(在类型修饰符处)。

答案 1 :(得分:0)

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

我有类似的问题:在我确定自己实际上返回的是空而不是空对象之前,我在GraphQL响应中一直出现“错误:缺少需求字段”错误。

答案 2 :(得分:0)

根据spec

  

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

换句话说,默认情况下是GraphQL中的类型可以为空。这样的字段

getUser: User

可能返回User对象或null。

之类的字段
name: String

可能返回String或null。只有通过将字段明确指定为非空值(在SDL中,通过将!附加到类型上),我们才能指定字段永远不会返回null。例如:

name: String!

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

在您的架构中,用户上的email字段为String!,这意味着它不能解析为null。如果您运行类似

的查询
query {
  getUser(user_id: "1") {
    email
  }
}

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