Graphql自定义标量,parseLiteral是否不调用null值?

时间:2019-05-30 22:38:23

标签: node.js graphql

我有一个自定义标量

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,但它永远不会在那里结束。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

这是预期的行为。 null在概念上是GraphQL中与标量或其他类型不同的一种值。通常,所有对象字段和参数都接受空值而不是实际值,也就是说,您可以提供一个或另一个。

例如,spec概述了用于强制输入对象字段的这些规则:

  
      
  • 如果为输入对象字段提供了null值,并且该字段的类型不是非null类型,则强制无序映射中的条目的值将为null ...
  •   
  • 如果为输入对象字段提供了文字值,则将根据该字段类型的输入强制规则,为强制无序映射中的条目提供强制该值的结果。
  •   

换句话说,如果提供了空值,则永远不会强制输入(解析)输入。标量也是如此:

  

对于以下所有类型,除了Non-Null外,如果提供显式值null,则输入强制结果为null。

整个null值的概念与GraphQL的可为空性规则紧密地交织在一起。空值应使用可用的类型(即非空类型)进行处理-建议不要在标量的强制逻辑中处理它们。