我有一个这样定义的突变:

# 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.中使用两个引号

但是,从我的客户端,我可以在Options数组中没有任何对象的情况下成功进行POST:

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!
  }

最佳答案

docs指出,如果列表中的类型为非null:


  这意味着列表本身可以为null,但不能包含任何内容
  空成员。


这意味着空数组仍然有效,但其中任何项目本身为null的数组则无效。

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


空值
[{},空值]
[{},{}]
[]


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


空值
[{},{}]
[]


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


[{},空值]
[{},{}]
[]


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


[{},{}]
[]


如果需要防止客户端提供空数组,则需要检查解析器内部参数是否为空数组,然后抛出一个错误。

关于javascript - GraphQL POST通过,即使缺少部分所需模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47062082/

10-11 14:17