gpt4 book ai didi

javascript - 在 GraphQL 中的突变之前删除只读字段

转载 作者:数据小太阳 更新时间:2023-10-29 04:39:51 26 4
gpt4 key购买 nike

我的模式中有一个名为 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 这样的错误。在字段“已更新” 中,未知字段。在字段“__typename”Unknown 字段中。在“id”字段中。这些都有根本原因,即这些字段未在输入类型上定义。

根据 spec,这是正确的行为:

(…) This unordered map should not contain any entries with names notdefined by a field of this input object type, otherwise an errorshould be thrown.

现在我的问题是处理这些情况的好方法是什么。我是否应该在我的应用代码中列出输入类型允许的所有属性?

如果可能的话,我想避免这种情况,也许有一个实用函数为我切掉它们,它知道输入类型。但是,由于客户端不知道模式,这必须发生在服务器端。因此,不必要的属性将转移到那里,我想这就是为什么一开始就不应该转移它们的原因。

有没有比维护属性列表更好的方法?

我正在使用 apollo-clientreact-apollographql-server-express

最佳答案

您可以使用片段进行查询,其中包括数据的所有可变字段。 filter utility 可以使用该片段在突变发生之前删除所有不需要的数据。

要点是:

const ArticleMutableFragment = gql`
fragment ArticleMutable on Article {
headline
subline
publishing {
published
time
}
}
`

const ArticleFragment = gql`
fragment Article on Article {
...ArticleMutable
id
created
updated
}
${ArticleMutableFragment}
`;

const query = gql`
query Article($id: ID!) {
article(id: $id) {
...Article
}
}
${ArticleFragment}
`;

const articleUpdateMutation = gql`
mutation updateArticle($id: ID!, $article: ArticleInput!) {
updateArticle(id: $id, article: $article) {
...Article
}
}
${ArticleFragment}
`;

...

import filterGraphQlFragment from 'graphql-filter-fragment';

...

graphql(articleUpdateMutation, {
props: ({mutate}) => ({
onArticleUpdate: (id, article) =>
// Filter for properties the input type knows about
mutate({variables: {id, article: filterGraphQlFragment(ArticleMutableFragment, article)}})
})
})

...

ArticleMutable 片段现在也可以重复用于创建新文章。

关于javascript - 在 GraphQL 中的突变之前删除只读字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42631523/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com