即使缺少所需架构的部分,GraphQL POST 也会通过

Posted

技术标签:

【中文标题】即使缺少所需架构的部分,GraphQL POST 也会通过【英文标题】:GraphQL POST passes even though parts of required schema are missing 【发布时间】:2018-04-14 04:43:46 【问题描述】:

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

# 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 数组中没有 任何 对象的情况下成功发布:

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】:

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

这意味着列表本身可以为空,但不能有任何 空成员。

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

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

空 [,null] [,] []

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

空 [,] []

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

[,null] [,] []

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

[,] []

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

【讨论】:

以上是关于即使缺少所需架构的部分,GraphQL POST 也会通过的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs graphql 上传错误:缺少 POST 正文。你忘记使用 body-parser 中间件了吗?

为啥即使我们尝试获取数据而不是更新/提交新数据,GraphQL 也会查询 POST 请求?

无法在 Next.js 应用程序中使用 Apollo-client GraphQL 上传文件:缺少 POST 正文

即使缺少所需的值,Django 验证也会调用 clean()

Spring post方法“缺少所需的请求正文”

缺少所需的架构 arm64