在突变前从 urql 查询结果中删除 __typename 字段

问题描述

当从 GraphQL Server 查询数据时,urql 添加一个 _typename 字段来跟踪缓存:

{
    __typename  "Book"
    name  "test"
    description "the book"
    id  "hPl39w4rzc2HZxkfHDyj"
    auther "John Doe"
}

我想更新这个对象并将它保存回数据库。当 useMutation 函数调用时,__typename 也会被传递,并且由于它不是服务器架构的一部分,因此会导致错误

Field \"__typename\" is not defined by type

我知道在调用 useMutation 之前我可以做这样的事情:

delete input.__typename;

但是我想知道在 urql 中是否有更好的全局处理方式?例如,在 apollo-client 中,您可以在更新之前使用 ApolloLink 从所有变量中删除 __typename

解决方法

const result = {
    __typename:  "Book",name:  "test",description: "the book",id:  "hPl39w4rzc2HZxkfHDyj",auther: "John Doe"
}

const {__typename,...rest} = result;

console.log(rest)

最好将该标记保留在 graphql 客户端中的对象上,因为它有助于缓存完成其任务。所以你可以根据需要删除它——在这里你可以更新“rest”并使用它来调用你的更新突变。