Implementé un RetryLink en mi Apollo Client de la siguiente manera:
const retryLink = new RetryLink({ attempts: (count, _, error) => { return count <= 5 && !!error; }, delay: (count, operation) => { const {response: { headers }} = operation.getContext(); // headers is always empty return count * 1000 * Math.random(); } });El objetivo es utilizar un encabezado personalizado enviado por el servidor para ajustar el retraso (el servidor tiene una tasa limitada). Sin embargo, el campo de encabezados en la respuesta siempre está vacío. La respuesta en sí está presente y tiene el siguiente aspecto:
{ body: (...) bodyUsed: true headers: Headers {} ok: false redirected: false status: 429 statusText: "" type: "cors" url: "https://graphql.endpoint.co/" }Si uso otro enlace, el encabezado está allí como se esperaba. Así que algo como esto funciona:
const afterwareLink = new ApolloLink((operation, forward) => { return forward(operation).map(response => { const context = operation.getContext(); const { response: { headers } } = context; if (headers) { console.log(headers.get('Retry-After')); } return response; }); });El cliente se ve así por el bien de la integridad:
const createApolloClient = () => { return new ApolloClient({ ssrMode: typeof window === 'undefined', link: from([retryLink, authLink.concat(httpLink)]), cache: new InMemoryCache() }); }; ¿Alguien sabe cómo podría usar los encabezados de respuestas en un RetryLink ?
A veces, una noche de sueño es todo lo que se necesita.
El enlace funciona como debería. El problema era que access-control-expose-headers no incluían Retry-After . Lo que no sabía es que las herramientas de desarrollo muestran todos los encabezados enviados por el servidor, pero los scripts solo pueden usar encabezados incluidos en access-control-expose-headers .
Esa es la razón por la que el encabezado siempre fue nulo.