即使目标对象存在,Apollo readQuery 也会失败?
Apollo readQuery Fails Even Though Target Object is Present?
我正在调用 readQuery。我收到一条错误消息:
modules.js?hash=2d0033b4773d9cb6f118946043f7a3d4385825fe:25847
Error: Can't find field resolutions({"id":"Resolution:DHSzPa8bvPCDjuAac"})
on object (ROOT_QUERY) {
"resolutions": [
{
"type": "id",
"id": "Resolution:AepgCCio9KWGkwyMC",
"generated": false
},
{
"type": "id",
"id": "Resolution:DHSzPa8bvPCDjuAac", // <==ID I'M SEEKING
"generated": false
}
],
"user": {
"type": "id",
"id": "User:WWv57KsvqWeAoBNHY",
"generated": false
}
}.
具有该 ID 的对象似乎作为决议列表中的第二个条目清晰可见。
这是我的查询:
const GET_CURRENT_RESOLUTION_AND_GOALS = gql`
query Resolutions($id: String!) {
resolutions(id: $id) {
_id
name
completed
goals {
_id
name
completed
}
}
}
`;
...我是这样称呼它的:
<Mutation
mutation={CREATE_GOAL}
update={(cache, {data: {createGoal}}) => {
let id = 'Resolution:' + resolutionId;
const {resolutions} = cache.readQuery({
query: GET_CURRENT_RESOLUTION_AND_GOALS,
variables: {
id
},
});
}}
>
我错过了什么?
更新
根据 Chrome 的 GraphQL 开发工具扩展,这里是整个 GraphQL 数据存储:
{
"data": {
"resolutions": [
{
"_id": "AepgCCio9KWGkwyMC",
"name": "testing 123",
"completed": false,
"goals": [
{
"_id": "TXq4nvukpLcqQhMRL",
"name": "test goal abc",
"completed": false,
"__typename": "Goal"
},
],
"__typename": "Resolution"
},
{
"_id": "DHSzPa8bvPCDjuAac",
"name": "testing 345",
"completed": false,
"goals": [
{
"_id": "PEkg5oEEi2tJ6i8LH",
"name": "goal abc",
"completed": false,
"__typename": "Goal"
},
{
"_id": "X4H4dFzGm5gkq5bPE",
"name": "goal bcd",
"completed": false,
"__typename": "Goal"
},
{
"_id": "hYunrXsMq7Gme7Xck",
"name": "goal cde",
"completed": false,
"__typename": "Goal"
}
"__typename": "Resolution"
}
],
"user": {
"_id": "WWv57KsvqWeAoBNHY",
"__typename": "User"
}
}
}
作为对有类似问题的 apollo 用户的回答发布:
去除Resolution:
的前缀,查询只取id
那么问题来了,你的datastore是怎么填充的?
要从缓存中读取查询,之前需要在远程 API 上使用完全相同的参数调用查询。通过这种方式,apollo 知道特定参数的字段结果是什么。如果您从未使用要使用的参数调用远程端点但知道结果是什么,则可以绕过它并通过实现缓存解析器在本地解析查询。查看 documentation 中的示例。这里的商店包含一个图书列表(在您的例子中 resultions
),并且可以通过简单的缓存查找来解决按 ID 查询单本书的问题。
我正在调用 readQuery。我收到一条错误消息:
modules.js?hash=2d0033b4773d9cb6f118946043f7a3d4385825fe:25847
Error: Can't find field resolutions({"id":"Resolution:DHSzPa8bvPCDjuAac"})
on object (ROOT_QUERY) {
"resolutions": [
{
"type": "id",
"id": "Resolution:AepgCCio9KWGkwyMC",
"generated": false
},
{
"type": "id",
"id": "Resolution:DHSzPa8bvPCDjuAac", // <==ID I'M SEEKING
"generated": false
}
],
"user": {
"type": "id",
"id": "User:WWv57KsvqWeAoBNHY",
"generated": false
}
}.
具有该 ID 的对象似乎作为决议列表中的第二个条目清晰可见。
这是我的查询:
const GET_CURRENT_RESOLUTION_AND_GOALS = gql`
query Resolutions($id: String!) {
resolutions(id: $id) {
_id
name
completed
goals {
_id
name
completed
}
}
}
`;
...我是这样称呼它的:
<Mutation
mutation={CREATE_GOAL}
update={(cache, {data: {createGoal}}) => {
let id = 'Resolution:' + resolutionId;
const {resolutions} = cache.readQuery({
query: GET_CURRENT_RESOLUTION_AND_GOALS,
variables: {
id
},
});
}}
>
我错过了什么?
更新
根据 Chrome 的 GraphQL 开发工具扩展,这里是整个 GraphQL 数据存储:
{
"data": {
"resolutions": [
{
"_id": "AepgCCio9KWGkwyMC",
"name": "testing 123",
"completed": false,
"goals": [
{
"_id": "TXq4nvukpLcqQhMRL",
"name": "test goal abc",
"completed": false,
"__typename": "Goal"
},
],
"__typename": "Resolution"
},
{
"_id": "DHSzPa8bvPCDjuAac",
"name": "testing 345",
"completed": false,
"goals": [
{
"_id": "PEkg5oEEi2tJ6i8LH",
"name": "goal abc",
"completed": false,
"__typename": "Goal"
},
{
"_id": "X4H4dFzGm5gkq5bPE",
"name": "goal bcd",
"completed": false,
"__typename": "Goal"
},
{
"_id": "hYunrXsMq7Gme7Xck",
"name": "goal cde",
"completed": false,
"__typename": "Goal"
}
"__typename": "Resolution"
}
],
"user": {
"_id": "WWv57KsvqWeAoBNHY",
"__typename": "User"
}
}
}
作为对有类似问题的 apollo 用户的回答发布:
去除Resolution:
的前缀,查询只取id
那么问题来了,你的datastore是怎么填充的?
要从缓存中读取查询,之前需要在远程 API 上使用完全相同的参数调用查询。通过这种方式,apollo 知道特定参数的字段结果是什么。如果您从未使用要使用的参数调用远程端点但知道结果是什么,则可以绕过它并通过实现缓存解析器在本地解析查询。查看 documentation 中的示例。这里的商店包含一个图书列表(在您的例子中 resultions
),并且可以通过简单的缓存查找来解决按 ID 查询单本书的问题。