[英]Apollo Client query Missing field __typename
我正在嘗試將apollo-link-rest
與 Star Wars 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"
}
我知道我可以更改設置此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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.