首页 文章

GraphQL部分更新响应类型

提问于
浏览
0

我现在正在开发一个GraphQL AppSync项目6个月,到目前为止我已经非常熟悉这个概念了 .

但是我遇到了一件事,根本没有在教程或文档中解释过 . 回归类型的最佳实践是什么? (特别是部分更新)

这是一个简化的示例模式:

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
    }
}

由于我只指定了 Headers 和价格,因此响应的其他字段将为null,如下所示:

{
    "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往返 .

到目前为止有什么想法

1 回答

  • 3

    如果从变异返回文章类型,它应该具有相同的值,就像您随后从其他查询返回它一样 .

    将突变视为将GraphQL从一种状态“变”为另一种状态的函数,然后(通常)返回一个可能发生变化的GraphQL所有部分的入口点 .

    我可以在评论中看到你的问题回复你担心表现 . 我的建议是不要让性能成为模拟架构的理由,几乎所有我在GraphQL中看到的性能问题确实都有解决方案,因此请关注建模 .

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

    type UpdateArticlePayload {
        article: Article!
        author: User!
    }
    
    type Mutation {
        updateArticle(input: ArticleUpdateInput!): UpdateArticlePayload!
    }
    

    这种有效负载模式可以更容易地随着时间的推移更改突变的范围,而原始建模则将您绑定到相对较窄的用例中 .

相关问题