【发布时间】:2017-07-26 16:06:15
【问题描述】:
我的架构中有一个名为 Article 的类型:
type Article {
id: ID!
updated: DateTime
headline: String
subline: String
}
对于它的更新,updateArticle(id: ID!, article: ArticleInput!) 突变使用了相应的输入类型:
input ArticleInput {
headline: String
subline: String
}
突变本身如下所示:
mutation updateArticle($id: ID!, $article: ArticleInput!) {
updateArticle(id: $id, article: $article) {
id
updated
headline
subline
}
}
文章总是作为一个整体保存(而不是一个一个字段),所以当我将一篇文章传递给我之前获取的那个突变时,它会抛出像 Unknown field. In field "updated"、Unknown field. In field "__typename" 和 @987654329 这样的错误@。这些有根本原因,这些字段没有在输入类型上定义。
根据spec,这是正确的行为:
(...) 这个无序映射不应该包含任何名称不是 由该输入对象类型的字段定义,否则出错 应该扔掉。
现在我的问题是处理这些情况的好方法是什么。我应该在我的应用代码中列出输入类型允许的所有属性吗?
如果可能的话,我想避免这种情况,并且可能有一个实用函数为我切掉它们,它知道输入类型。但是,由于客户端不知道架构,这必须发生在服务器端。因此,不必要的属性将被转移到那里,我想这就是为什么它们不应该首先被转移的原因。
有没有比维护属性列表更好的方法?
我正在使用apollo-client、react-apollo 和graphql-server-express。
【问题讨论】:
-
你能显示你正在调用的实际突变吗?听起来这里有些不对劲。
-
感谢@marktani 的快速回复!我已将突变代码添加到问题中。
-
您是否有可能对您的服务器运行“原始”突变?也就是说,使用 GraphiQL 或 HTTP 客户端,如 curl 或 fetch。我想了解这是 Apollo 抛出的错误还是您的服务器抛出的错误。
-
我刚刚用 curl 模拟了请求。该错误肯定是由服务器抛出的。删除输入类型未知的字段可以解决问题。
-
没错,根本原因似乎是突变不知道这些领域。我首选的解决方案是忽略它们,但这将涉及将它们传输到服务器,我想这是不支持的原因。遗憾的是,我无法与您共享端点,但我猜当使用包含额外字段的输入类型调用突变时,每个 GraphQL 端点都会以相同的方式响应。
标签: javascript graphql graphql-js react-apollo apollo-client