加入我们,从10月8日至10日在纽约市,了解关于 GraphQL Federation 和 API 平台工程的最新的技巧、趋势和新闻。参加2024年纽约市的 GraphQL Summit
文档
免费开始
自从3.8.0

移除Typename Link

自动从变量中删除 __typename 字段。


概述

当将来自一个作为传递给另一个操作__typename字段可能导致错误。为了避免这种情况,您可以使用removeTypenameFromVariables链接来自动从操作中的__typename字段中删除

从所有变量中删除__typename

例如,考虑以下查询自动为每个字段__typename选择集添加字段。

const query = gql`
query DashboardQuery($id: ID!) {
dashboard(id: $id) {
id
name
}
}
`;
const { data } = await client.query({ query, variables: { id: 1 }});
// {
// "dashboard": {
// "__typename": "Dashboard",
// "id": 1,
// "name": "My Dashboard"
// }
// }

现在,让我们通过向我们的服务器发送一个来更新这个仪表板。我们将使用之前查询返回的dashboard作为传入突变的数据。

const mutation = gql`
mutation UpdateDashboardMutation($dashboard: DashboardInput!) {
updateDashboard(dashboard: $dashboard) {
id
name
}
}
`;
await client.mutate({
mutation,
variables: {
dashboard: { ...data.dashboard, name: 'My Updated Dashboard' }
}
});

如果没有使用removeTypenameFromVariables链接,由于data.dashboard仍然包含__typename字段,服务器将返回错误。

用法

您可以如此导入和实例化它

import { removeTypenameFromVariables } from '@apollo/client/link/remove-typename';
const removeTypenameLink = removeTypenameFromVariables();

在您的链路链接之前引入终止链接的任何位置使用removeTypeNameLink来从所有操作中移除变量中的__typename字段。

import { from } from '@apollo/client';
const link = from([removeTypenameLink, httpLink]);
const client = new ApolloClient({
link,
// ... other options
});

如果您使用方向性组合,例如,将订阅发送到websocket连接,请将订阅放置在splitLink之前,以从所有操作中移除变量中的__typename

import { from, split } from '@apollo/client';
import { removeTypenameFromVariables } from '@apollo/client/link/remove-typename';
const removeTypenameLink = removeTypenameFromVariables();
const splitLink = split(
({ query }) => {
const definition = getMainDefinition(query);
return (
definition.kind === 'OperationDefinition' &&
definition.operation === 'subscription'
);
},
wsLink,
httpLink,
);
const link = from([removeTypenameLink, splitLink]);
const client = new ApolloClient({
link,
// ... other options
});

在JSON标量中保留`__typename`

有时,您可能需要保留查询响应中的__typename字段,例如在JSON标量输入字段中的__typename

尽管GraphQL 类型验证规范不允许使用两个下划线 开头的输入字段__,但当输入字段是JSON 标量时,此限制不适用。

为此,在实例化removeTypenameFromVariables时提供except选项,并使用KEEP哨兵表示哪些变量类型应保留__typename。每个except选项中的键都应与您的中的输入类型对应。

例如,假设您的模式包含一个ConfigureDashboardMutation 突变,它接受一个名为$dashboardConfigJSON类型变量。

mutation ConfigureDashboardMutation($dashboardConfig: JSON) {
configureDashboard(config: $dashboardConfig) {
id
}
}

您可以让removeTypenameFromVariables链接保留任何声明为JSON类型的变量中的所有__typename字段。类型由GraphQL查询推断。

import { removeTypenameFromVariables, KEEP } from '@apollo/client/link/remove-typename';
const removeTypenameLink = removeTypenameFromVariables({
except: {
JSON: KEEP
}
});

注意:JSON 标量类型不需要字面量命名为JSON才被认为是JSON 标量

当查询通过removeTypenameFromVariables链接时,dashboardConfig 变量将被检测为JSON 标量类型,并且所有__typename字段都保持不变。

输入变量中的嵌套JSON标量字段

并非所有顶层 变量都可能映射到JSON 标量类型。对于更复杂的输入,JSON标量可能位于嵌套 字段中。该except选项可让您配置这些类型内的嵌套 字段以保持__typename不变。

import { removeTypenameFromVariables, KEEP } from '@apollo/client/link/remove-typename';
const removeTypenameLink = removeTypenameFromVariables({
except: {
DashboardInput: {
config: KEEP
}
}
});

声明的类型为DashboardInput将移除任何顶层__typename字段,但保持config字段的__typename

此嵌套可以有多深,需要多少字段就有多少字段。使用KEEP哨兵来确定__typename应该保留的位置。

import { removeTypenameFromVariables, KEEP } from '@apollo/client/link/remove-typename';
const removeTypenameLink = removeTypenameFromVariables({
except: {
// Keep __typename for `bar` and `baz` fields on any variable
// declared as a `FooInput` type
FooInput: {
bar: KEEP,
baz: KEEP,
},
// Keep __typename for the `baz.qux` field on any variable
// declared as a `BarInput` type
BarInput: {
baz: {
qux: KEEP
}
},
// Keep __typename on `bar.baz` and `bar.qux.foo` fields for any
// variable declared as a `BazInput` type
BazInput: {
bar: {
baz: KEEP,
qux: {
foo: KEEP
}
}
},
}
});

要在数组中的嵌套字段中保留__typename,请使用与字段为时的相同对象表示法。

import { removeTypenameFromVariables, KEEP } from '@apollo/client/link/remove-typename';
const removeTypenameLink = removeTypenameFromVariables({
except: {
// Keep __typename on the `config` field for each widget
// in the `widgets` array for variables declared as
// a `DashboardInput` type
DashboardInput: {
widgets: {
config: KEEP
}
}
}
});

选项

名称
类型
描述
except

KeepTypenameConfig

确定哪些输入类型应该保留__typename。此映射输入类型到配置,该配置可以是KEEP哨兵或字段的嵌套配置。

上一部分
持久查询
下一部分
REST
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apollo Graph Inc.,以Apollo GraphQL名义。

隐私政策

公司