Запрос клиента Apollo Отсутствует поле __typename - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь использовать 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"​​​
​​​}​​​

Я знаю, что могу изменить это значение InMemoryCache({ addTypename: false }), чтобы устранить ошибки, но я не знаю, как повлияет на кеширование, если установить addTypename на false.

Может ли кто-нибудь указать мне правильное направление?

Ура!

1 Ответ

0 голосов
/ 15 ноября 2018

Посмотрите, что документы говорят о исправлении typename .

Ваша директива @rest сообщает клиенту, какое typename следует ожидать для поля 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
    },
  },
})
...