graphqlapollomissing-dataapollo-clienttypepolicies

Apollo - Updating cache when some fields in some results are missing


For the following query, in some objects in the results array, some of the requested fields might not be present in the response (for example photo or address), which causes the data of my useQuery to be undefined (without any error or warning).

people(xyz: { q: $q, offset: $offset, rows: $rows }) {
  results {
    uri          <--- this is a field of type ID!
    name
    photo
    address {
      city
      country
    }
  }
}

My fix is to specifically check if the field exists in the incoming data and provide a fallback value, i.e.: pass a type policy for Person to be {keyFields: false} and do this in the merge function:

newItem = {...item};
newItem.photo = item.photo ?? null;
newItem.address = item.address ?? {city: "", country: ""};

Is the reason for having to do this that there's no id field in the Person type (instead, uri is of type ID!)?

Can I handle this in a better way?


Solution

  • Found a better way on Apollo GraphQL's GitHub.

    I'd still appreciate a solution where I don't have to go over each type's nullable field in turn, if there is one.

    function nullable() {
      // Create a generic field policy that allows any field to be null by default:
      return {
        read(existing = null) {
          return existing;
        },
      };
    }
    
    new InMemoryCache({
      typePolicies: {
        Person: {
          fields: {
            photo: nullable(),
            address: nullable(),
          },
        },
        Address: { // If there's the case of either city or country missing
          fields: {
            city: nullable(), 
            country: nullable(),
          }
        }
      },
    })