GraphQL 部分更新响应类型

标签 graphql apollo aws-appsync

到目前为止,我已经在 GraphQL AppSync 项目上工作了 6 个月,到目前为止我已经非常熟悉这个概念了。

但是我遇到了一件事,教程或文档中根本没有解释这一点。 Mutation 返回类型的最佳实践是什么? (尤其是部分更新)

这是一个简化的示例架构:

type Article {
    uuid: ID
    title: String
    description: String
    price: Int
    tax: Int
    category_uuid: ID
    status: Int
    type: Int
}

input ArticleUpdateInput {
    uuid: ID!
    title: String
    description: String
    price: Int
    tax: Int
    category_uuid: ID
    status: Int
    type: Int
}

type Mutation {
    updateArticle(input: ArticleUpdateInput!): Article!
}

以下突变是有效的:

mutation foo {
    updateArticle(input: {
        uuid: "c63c6dcb-6c09-4952-aae2-26e3fde47262",
        title: "BBQ Burger",
        price: 699
    }) {
        __typename
        uuid
        title
        description
        price
        tax
        category_uuid
        status
        type
    }
}

由于我只指定了标题和价格,响应的其他字段将为空,如下所示:

{
    "data": {
        "updateArticle": {
            "__typename": "Article",
            "uuid": "c63c6dcb-6c09-4952-aae2-26e3fde47262",
            "title": "BBQ Burger",
            "description": null,
            "price": 699,
            "tax": null,
            "category_uuid": null
            "status": null
            "type": null
        }
    }
}

避免返回这些空字段的最佳实践是什么? 我应该在更新后触发 getArticle 查询并从数据库返回整篇文章记录吗?我认为这会非常低效,因为如果你想添加n篇文章,就会有2*n次往返数据库。

到目前为止有什么想法吗?

最佳答案

如果您从突变返回文章类型,它应该具有与您随后从不同查询返回它相同的值。

将突变视为将 GraphQL 从一种状态“突变”到另一种状态的函数,然后(按照惯例)返回 GraphQL 中可能发生更改的所有部分的入口点。

我在对您问题的评论回复中看到您担心性能。我的建议是不要让性能成为架构建模不佳的理由,几乎我在 GraphQL 中看到的每个性能问题都有解决方案,因此请专注于建模。

此外,您可能不想直接返回文章,它限制了您包含其他更改的能力。假设 User 类型有一个 publishedArticleCount 非规范化字段,客户端需要知道该字段何时发生更改,这意味着需要通过突变来访问它。所以你可能想做这样的事情:

type UpdateArticlePayload {
    article: Article!
    author: User!
}

type Mutation {
    updateArticle(input: ArticleUpdateInput!): UpdateArticlePayload!
}

这种有效负载模式可以更轻松地随着时间的推移改变突变的范围,而您的原始建模将您束缚在相对狭窄的用例中。

关于GraphQL 部分更新响应类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50970599/

相关文章:

ios - AWS Appsync 复杂订阅参数

javascript - Strapi 动态区域 - 在 Gatsby 中显示图像

graphql - 突变方法是否需要在顶层?

vuejs2 - Vue + Apollo : TypeError: this. getClient(...).watchQuery 不是函数

amazon-web-services - 如何操作 AWS AppSync 和 GraphQL 以符合 DynamoDB 最佳实践?

amazon-web-services - 如何使用 AppSync 解决父子关系

java - Apollo Android Client - 无法访问类路径上生成的类

javascript - Apollo-client _mutation 输入类型 - 提供的数据为空

javascript - 意外的标记 { 语法错误

javascript - Next.JS 静态站点生成和客户端 Apollo 获取