3

I am trying to use apollo-link-rest with the Star Wars API and I am getting some errors.

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));

Errors:

​​​Missing field __typename in {​​​
​​​  "name": "Luke Skywalker"​​​
​​​}​​​
​​​​​​
​​​Missing field __typename in {​​​
​​​  "name": "Anakin Skywalker"​​​
​​​}​​​
​​​​​​
​​​Missing field __typename in {​​​
​​​  "name": "Shmi Skywalker"​​​
​​​}​​​

I know I can change set this InMemoryCache({ addTypename: false }) to remove the errors, but I don't know what the impact on caching will be if I set addTypename to false.

Can someone point me in the right direction on this?

Cheers!

joelnet
  • 13,621
  • 5
  • 35
  • 49

2 Answers2

4

Check out what the docs have to say about typename patching.

Your @rest directive tells the client what typename to expect for the search field, but doesn't say anything about any types inside the field's selection set. There's two ways to fix that. You can use a @type directive:

query people {
  search @rest(type: "Search", path: "people/?search=skywalker", endpoint: swapi) {
    count
    results @type(name: "Person") {
      name
    }
  }
}

Or configure a typePatcher. Something like:

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
    },
  },
})
Daniel Rearden
  • 80,636
  • 11
  • 185
  • 183
0

More generic answer:

to avoid the missing __typename error ensure any arrays in your GQL model has a corresponding field __typename for EACH object in the array.

DeBraid
  • 8,751
  • 5
  • 32
  • 43