省略可选输入设置为 null 而不是未定义

Str*_*ler 5 javascript apollo graphql apollo-server react-apollo

大约一年前,对apollo-server(或react-apollo?)进行了更新,这完全打破了 GraphQL 请求中省略可空输入的旧用法。

在更新之前,您可以定义如下内容:

Mutation {
  editProfile(id: ID!, name: String, avatar: String)
}
Run Code Online (Sandbox Code Playgroud)

当调用省略输入的客户端时,请说:

editProfile(id: "whateverid", name: "James")
Run Code Online (Sandbox Code Playgroud)

你在你的解析器中得到avatarundefined现在已设置为null.

问题是:null例如,对于某些可选输入来说 是一个完全有效的值avatar。所以基本上,我们在这个过程中丢失了信息,并且不再能够区分服务器端之间的区别:

  • 被省略并出现的可选输入null(=不更新数据库),以及
  • 显式设置为null(= 更新数据库)的可选输入

我在 Github 上打开了一个关于它的线程:https ://github.com/apollographql/apollo-server/issues/2056

一年前,另一个人在react-apolloGithub 上做了同样的事情: https: //github.com/apollographql/react-apollo/issues/1569

dacz 发布了一个有趣的回复,总结得很好:

当可空输入未出现在 apollo 客户端的查询变量中时,将使用空值进行调用。客户端不应将整个输入作为 null 传递,而应完全省略它或以 undefined 传递它。传递 null 可能意味着显式将输入设为 null。同样适用于输入字段,因此服务器可能会对显式重置值做出反应(在输入中显示为 null,或者如果省略则不处理它)。

这两个线索仍然悬而未决。

有人对此有任何干净的解决方案吗?