在Apollo GraphQL中,字段设为null与不发送该字段是否等效?
GraphQL Mutation中null字段与缺省字段的等效性问题
我正在实现一个React TypeScript应用,通过GraphQL(前端采用Apollo)与Kotlin后端通信。我的Mutation定义如下:
updateProfile(input: UpdateProfileInput) input UpdateProfileInput { firstName: String lastName: String email: String }
需求是仅发送已修改的字段,若email与数据库现有值一致则不发送。我想了解:在前端将未修改字段设为null时,后端是否会识别为该字段已发送?比如发送以下两个input是否等效:
const input1 = { firstName: null, lastName: null, email: "test@test.com" // <- 更新后的email } const input2 = { email: "test@test.com" }
答案
这两个input完全不等效,后端会做出完全不同的处理:
- 对于
input1,你显式传递了firstName和lastName的null值,后端会认为你要将这两个字段的数据库值设置为null(也就是清空这两个字段内容)。 - 对于
input2,你只传递了email字段,后端会仅处理email的更新,不会对firstName和lastName的现有值做任何改动。
结合你的需求(仅发送已修改字段),正确的做法是:只在input中保留确实发生修改的字段。如果某个字段和数据库现有值一致,直接从input对象中移除该字段,不要包含在请求里——不管是设为null还是保留原值,只要显式传递了,后端就会判定为你要修改该字段。
本质上,GraphQL的输入类型规则是:只要你在请求中显式指定了某个字段(哪怕值是null),后端就会接收到这个字段的对应值;未指定的字段,后端不会获取到,也就不会触发对应字段的更新逻辑。
内容的提问来源于stack exchange,提问作者Cyrielle Albert
相关产品推荐
相关产品推荐

