我有一个自定义标量
export const GraphQLObjectId = new GraphQLScalarType({
name: "GraphQLObjectId",
description: "whatever",
...
parseValue(value) {
console.log("parseValue");
console.log(value);
...
},
parseLiteral(ast) {
console.log("parseLiteral");
console.log(ast);
...
}
});
还有这样的突变
mutation {
updateInstrument(
input: {
_id: "558ba89433d865236cb94bd5"
name: "whatnot"
issuerId: null
}
) {
_id
}
}
_id和issuerId均为GraphQLObjectId类型。
但是只有_id通过parseLiteral函数,而不是issuerId。 如果我将issuerId更改为“ 000000000000000000000000”,它也会通过parseLiteral(), 但我打算在parseLiteral()中处理null,但它永远不会在那里结束。
我在做什么错了?
答案 0 :(得分:0)
这是预期的行为。 null
在概念上是GraphQL中与标量或其他类型不同的一种值。通常,所有对象字段和参数都接受空值而不是实际值,也就是说,您可以提供一个或另一个。
例如,spec概述了用于强制输入对象字段的这些规则:
- 如果为输入对象字段提供了null值,并且该字段的类型不是非null类型,则强制无序映射中的条目的值将为null ...
- 如果为输入对象字段提供了文字值,则将根据该字段类型的输入强制规则,为强制无序映射中的条目提供强制该值的结果。
换句话说,如果提供了空值,则永远不会强制输入(解析)输入。标量也是如此:
对于以下所有类型,除了Non-Null外,如果提供显式值null,则输入强制结果为null。
整个null值的概念与GraphQL的可为空性规则紧密地交织在一起。空值应使用可用的类型(即非空类型)进行处理-建议不要在标量的强制逻辑中处理它们。