为什么参数类型为`String!`的mutation函数可以传入null值执行?
问题原因
- 该现象是低版本Hasura GraphQL引擎的设计差异导致的,核心是查询和变更操作对变量类型的校验逻辑不一致。
- 查询操作的校验严格遵循GraphQL类型规范:你在查询语句中声明了
$test_value: String!(非空字符串类型),传入null会直接触发GraphQL层面的类型校验失败,这和你观察到的结果一致。 - 低版本Hasura的变更操作校验优先对齐数据库约束:对于插入类变更,当传入的null值匹配数据库对应字段的可空属性时,Hasura会跳过GraphQL层面的非空校验,直接将null写入数据库。你的
test_value字段本身是可空的TEXT类型,所以插入操作直接执行成功。 - 可以做个验证:将
test_value字段修改为非空TEXT类型,再执行相同的传null的变更操作,此时就会触发预期的校验错误。
修复方案
- 升级Hasura到v2.10.0及以上版本,该版本已经修复了校验逻辑不一致的问题,变更操作也会严格遵循GraphQL的非空类型约束。
- 暂时无法升级的情况下,在业务代码层提前做变量非空校验,避免不符合预期的null值写入数据库。
内容的提问来源于stack exchange,提问作者Amantel
相关产品推荐
相关产品推荐

