我正在使用GraphQL API(我不拥有(来访问数据。我大量使用片段,我不止一次遇到的一个问题是片段似乎无法深度融合。考虑以下查询:
fragment BasicInfo on Person {
id
name
address {
city
country
}
}
query ProfileCard($id: ID) {
personById(id: $id) {
...BasicInfo
id
age
address {
streetName
streetNumber
}
}
}
在这里,我们运行一个基本查询,从个人资料卡中获取一些信息,包括此人的年龄和一些地址(街道名称和号码(。简档卡使用的另一个组件也想要一些可以在BasicInfo
片段中找到的信息。这包括他们的名字以及他们的城市和国家。
运行此查询将返回一个包含以下字段的对象:id
、name
、age
、address.streetName
和address.streetNumber
。
address.city
和address.country
都丢失了——查询似乎没有深度合并片段,只是在浅层插入了它。
是否可以强制我的碎片深度合并这甚至是预期的行为吗?我是否必须与API所有者联系以更正此问题?
我很难找到这样或那样的文档。
我刚刚在使用@apollo/client
时遇到了类似的问题,有趣的是,它也与地址模型有关。我的第二个片段似乎被完全忽略了,没有被合并。我在下面写了一个foobar
代码示例:
type Request = {
id: string
stops: Array<Stop>
}
type Stop = {
id: string;
address: Address;
}
type Address = {
id: string;
address1: string;
name: string;
}
const ROOT_FRAGMENT = gql`
fragment foo_Request on Request {
id
stops {
...bar_Stop
...qux_Stop
}
${STOP_FRAGMENT_1}
${STOP_FRAGMENT_2}
}
`;
const STOP_FRAGMENT_1 = gql`
fragment bar_Stop on Stop {
id
address {
id
address1
}
}
}
`;
const STOP_FRAGMENT_2 = gql`
fragment qux_Stop on Stop {
id
address {
id
name
}
}
}
`;
/*
expected:
{
id: "request-1"
stops: [
{
id: "stop-1",
address: {
id: "address-1",
address1: "123 my way",
name: "Home",
},
},
],
}
actual:
{
id: "request-1"
stops: [
{
id: "stop-1",
address: {
id: "address-1",
address1: "123 my way",
},
},
],
}
*/
请尝试使用别名。类似的东西
fragment BasicInfo on Person {
id
name
cityCountryAddress: address {
city
country
}
}