gpt4 book ai didi

javascript - Apollo 客户端查询缺少字段 __typename

转载 作者:行者123 更新时间:2023-11-29 20:48:17 25 4
gpt4 key购买 nike

我正在尝试将 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
},
},
})

关于javascript - Apollo 客户端查询缺少字段 __typename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53325787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com