我有以下架构:
type User {
email: String!,
user_id: String!,
img: String!,
},
type Query {
getUser(user_id: String!): User
}
模式反映了我必须返回User
个对象的事实。但是,我不能总是这样做,有时我需要返回null。例如,如果我向DB发出请求,它将返回return对象或null(如果未找到用户)。
在我的GraphQL架构中,我设置了特定字段的类型。如果我尝试返回与我设置的类型不同的类型,则会出错。如何允许字段返回对象或null?
答案 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必须解析为null
或undefined
才能强制为空值。换句话说,如果您返回一个空对象({}
),一个空数组([]
)或其他某个值,则GraphQL将在您返回一个对象而不是空值时将其视为! >
在您的架构中,用户上的email
字段为String!
,这意味着它不能解析为null。如果您运行类似
query {
getUser(user_id: "1") {
email
}
}
并且getUser
的解析器返回一个空对象({}
),GraphQL将尝试解析email
,为其返回null并炸毁,因为email
不是应该为空!但是,如果getUser
解析为null,则不会解析任何子字段,并且不会出现任何错误。