即使缺少部分必需模式,GraphQL POST也会通过

时间:2017-11-01 19:14:14

标签: javascript ecmascript-6 graphql

我有一个如此定义的突变:

# POST a new Translation
    createTranslation(
      name: String!
      options: [OptionInput!]!
    ): Translation

根据我的理解,使用[OptionInput!]! means that an array is REQUIRED, and an object of the type OptionInput is also REQUIRED.

的两个引号

但是,从我的客户端,我能够在选项数组中没有任何对象的情况下成功发布:

const createTranslation = gql`
  mutation createTranslation(
    $name: String!,
    $options: [OptionInput!]!
  ) {
    createTranslation(
      name: $name,
      options: $options
    ) {
      _id
    }
  }
`;

即使我期待开箱即用的验证错误(样本响应):

{
  "data": {
    "translations": [
      {
        "_id": "59fa1b7a3d4d4805ed6f7539",
        "name": "Sample Translation Name!!!",
        "options": []
      }
    ]
  }
}

确保使用对象数组的子字段不包含任何空值的正确方法是什么?

PS:这是我输入的OptionInput

input OptionInput {
    text: String!
    value: String!
  }

1 个答案:

答案 0 :(得分:1)

正如文档所述,如果列表中的类型是非空的:

  

这意味着列表本身可以为null,但它不能有   null成员。

这意味着空数组仍然有效,但是任何项本身为空的数组都不是。

[OptionInput]表示所有这些都有效:

  • [{},空
  • [{},{}]
  • []

[OptionInput!]表示所有这些都有效:

  • [{},{}]
  • []

[OptionInput]!表示所有这些都有效:

  • [{},空
  • [{},{}]
  • []

[OptionInput!]!表示所有这些都有效:

  • [{},{}]
  • []

如果您需要阻止客户端提供空数组,您需要检查解析器中的参数是否为空数组,然后只是抛出错误。