Apollo 客户端查询缺少字段 __typename
Apollo Client query Missing field __typename
我正在尝试将 apollo-link-rest
与星球大战 API 一起使用,但我遇到了一些错误。
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloClient } from "apollo-client";
import { RestLink } from "apollo-link-rest";
import gql from "graphql-tag";
// node environment?
const fetch = require("node-fetch");
global.fetch = fetch;
global.Headers = fetch.Headers;
const restLink = new RestLink({
endpoints: { swapi: "https://swapi.co/api/" }
});
const client = new ApolloClient({
link: restLink,
cache: new InMemoryCache()
});
const query = gql`
query people {
search
@rest(type: "Search", path: "people/?search=skywalker", endpoint: swapi) {
count
results {
name
}
}
}
`;
client
.query({ query })
.then(response => console.log(JSON.stringify(response)))
.catch(err => console.log(err));
错误:
Missing field __typename in {
"name": "Luke Skywalker"
}
Missing field __typename in {
"name": "Anakin Skywalker"
}
Missing field __typename in {
"name": "Shmi Skywalker"
}
我知道我可以更改 set this InMemoryCache({ addTypename: false })
来消除错误,但我不知道如果我将 addTypename
设置为 false
会对缓存产生什么影响。
有人能指出我正确的方向吗?
干杯!
查看文档对 typename patching 的看法。
您的 @rest
指令告诉客户端 search
字段期望的类型名称,但没有说明字段选择集中的任何类型。有两种方法可以解决这个问题。您可以使用 @type
指令:
query people {
search @rest(type: "Search", path: "people/?search=skywalker", endpoint: swapi) {
count
results @type(name: "Person") {
name
}
}
}
或者配置一个typePatcher
。类似于:
const restLink = new RestLink({
uri: 'https://swapi.co/api/',
typePatcher: {
Search: (data, outerType, patchDeeper) => {
if (data.results != null) {
data.results = data.results.map(person => {
return {__typename: "Person", ...person }
});
}
return data
},
},
})
更通用的答案:
为避免 missing __typename
错误,请确保您的 GQL 模型中的任何数组对于数组中的每个对象都有对应的字段 __typename
。
我正在尝试将 apollo-link-rest
与星球大战 API 一起使用,但我遇到了一些错误。
import { InMemoryCache } from "apollo-cache-inmemory";
import { ApolloClient } from "apollo-client";
import { RestLink } from "apollo-link-rest";
import gql from "graphql-tag";
// node environment?
const fetch = require("node-fetch");
global.fetch = fetch;
global.Headers = fetch.Headers;
const restLink = new RestLink({
endpoints: { swapi: "https://swapi.co/api/" }
});
const client = new ApolloClient({
link: restLink,
cache: new InMemoryCache()
});
const query = gql`
query people {
search
@rest(type: "Search", path: "people/?search=skywalker", endpoint: swapi) {
count
results {
name
}
}
}
`;
client
.query({ query })
.then(response => console.log(JSON.stringify(response)))
.catch(err => console.log(err));
错误:
Missing field __typename in {
"name": "Luke Skywalker"
}
Missing field __typename in {
"name": "Anakin Skywalker"
}
Missing field __typename in {
"name": "Shmi Skywalker"
}
我知道我可以更改 set this InMemoryCache({ addTypename: false })
来消除错误,但我不知道如果我将 addTypename
设置为 false
会对缓存产生什么影响。
有人能指出我正确的方向吗?
干杯!
查看文档对 typename patching 的看法。
您的 @rest
指令告诉客户端 search
字段期望的类型名称,但没有说明字段选择集中的任何类型。有两种方法可以解决这个问题。您可以使用 @type
指令:
query people {
search @rest(type: "Search", path: "people/?search=skywalker", endpoint: swapi) {
count
results @type(name: "Person") {
name
}
}
}
或者配置一个typePatcher
。类似于:
const restLink = new RestLink({
uri: 'https://swapi.co/api/',
typePatcher: {
Search: (data, outerType, patchDeeper) => {
if (data.results != null) {
data.results = data.results.map(person => {
return {__typename: "Person", ...person }
});
}
return data
},
},
})
更通用的答案:
为避免 missing __typename
错误,请确保您的 GQL 模型中的任何数组对于数组中的每个对象都有对应的字段 __typename
。