Uso Apollo-Client para obtener datos con GraphQL.
Quiero que Apollo-Client obtenga los datos del caché y también los obtenga a través de la red (en segundo plano), para que el caché pueda actualizarse en caso de que los datos hayan cambiado. Pero quiero que Apollo-Client devuelva solo los datos almacenados en caché (aunque también obtiene los datos a través de la red) para que mi aplicación pueda continuar ejecutándose rápidamente (usando los datos almacenados en caché). (¿Cómo puedo conseguir esto?
¿Tal vez pueda usar la política de recuperación de cache-and-network ?
const client = new ApolloClient({ uri: 'https://example.com/graphql', cache: new InMemoryCache(), defaultOptions: { query: { fetchPolicy: 'cache-and-network', }, }, }); Con esa política, no es posible usar client.query() , por lo que necesitaba cambiar a client.watchQuery() . Este método devuelve un observable del paquete zen-observable . Como es habitual con los observables, puede suscribirse a los cambios del observable. Escribí una función que, dado un cliente, ejecuta watchQuery y devuelve una promesa que contiene el primer resultado:
export function firstWatchedQuery(aClient, options) { return new Promise((resolve, reject) => aClient.watchQuery(options).subscribe({ next: (value) => resolve(value), error: (error) => reject(error), })) } Ahora puedo usar esta función, por ejemplo, dentro getServerSideProps() dentro de una aplicación Next.js:
export async function getServerSideProps() { const { data } = await firstWatchedQuery(client, { query }); return { props: { objects: data.type.nodes }}; }Pero el código no funciona como esperaba: Parece que no actualiza el caché al recargar la página. ¿Qué estoy haciendo mal?