【发布时间】:2019-04-11 03:46:39
【问题描述】:
在我们的 GraphQL API 更新中,只有模型 _id 字段是必需的,因此以下 SDL 语言代码中的 ! 是必需的。 name 等其他字段不必包含在更新中,但也不能有 null 值。目前,从名称字段中排除! 允许最终用户不必在更新中传递name,但它允许他们为name 传递null 值,这是不允许的。
null 值让我们知道需要从数据库中删除一个字段。
下面是一个可能导致问题的模型示例 - Name 自定义标量不允许空值,但 GraphQL 仍然允许它们通过:
type language {
_id: ObjectId
iso: Language_ISO
auto_translate: Boolean
name: Name
updated_at: Date_time
created_at: Date_time
}
input language_create {
iso: Language_ISO!
auto_translate: Boolean
name: Name!
}
input language_update {
_id: ObjectId!
iso: Language_ISO!
auto_translate: Boolean
name: Name
}
当传入一个空值时,它会绕过我们的标量,因此如果空值不是允许的值,我们就不能抛出用户输入验证错误。
我知道! 表示non-nullable,缺少! 表示该字段可以为空,但令人沮丧的是,据我所知,我们无法指定字段的确切值如果一个字段不是必需的/可选的。此问题仅在更新时出现。
有没有什么方法可以通过自定义标量来解决这个问题,而不必开始将逻辑硬编码到每个看起来很麻烦的更新解析器中?
应该失败的突变示例
mutation tests_language_create( $input: language_update! ) { language_update( input: $input ) { name }}
变量
input: {
_id: "1234",
name: null
}
2018 年 9 月 11 日更新: 作为参考,我找不到解决方法,因为使用自定义标量、自定义指令和验证规则存在问题。我在 GitHub 上打开了一个问题:https://github.com/apollographql/apollo-server/issues/1942
【问题讨论】:
-
您尝试过架构指令吗? [链接] (apollographql.com/docs/graphql-tools/schema-directives.html)
-
@AmitBhoyar 好声音 - 我现在试试然后回来 - 应该考虑指令!谢谢!
-
正在尝试指令路由,但输入字段似乎存在问题 - github.com/apollographql/graphql-tools/issues/858
-
@MatthewP 我已经用替代解决方案更新了我的答案。它不如在输入字段本身上使用指令那么好,但它应该是一种功能性的解决方法。
标签: node.js graphql graphql-js apollo-server