Apollo-link: Manejar la respuesta de error según el `Tipo de contenido`

Creado en 25 mar. 2018  ·  3Comentarios  ·  Fuente: apollographql/apollo-link

El encabezado de aceptación predeterminado se establece en */* :

https://github.com/apollographql/apollo-link/blob/a79f47e8ae81ee2444d547315be61dbafea37dcb/packages/apollo-link-http-common/src/index.ts#L98

Pero asumimos incorrectamente que la respuesta es json e intenta JSON.parse(bodyText) , sin verificar el tipo de contenido de bodyText .

https://github.com/apollographql/apollo-link/blob/a79f47e8ae81ee2444d547315be61dbafea37dcb/packages/apollo-link-http-common/src/index.ts#L123 -L137

Si su servidor devuelve un 403 text/plain por ejemplo:

HTTP/1.1 403 Forbidden
Content-Type: text/plain; charset=utf-8
Content-Length: 18
Date: Sun, 25 Mar 2018 20:08:00 GMT
Connection: keep-alive

Invalid CSRF token

Apolo arroja un extraño error:

overview.js:80369 Error: Network error: Unexpected token I in JSON at position 0
    at new ApolloError (overview.js:70404)
    at ObservableQuery.webpackJsonp.../../../../../public/next/next-apollo/node_modules/.registry.npmjs.org/apollo-client/2.2.0/node_modules/apollo-client/core/ObservableQuery.js.ObservableQuery.currentResult (overview.js:68953)
    at ProxyComponent.Query._this.getQueryResult (overview.js:52088)
    at ProxyComponent.webpackJsonp.../../../../../../node_modules/.registry.npmjs.org/react-apollo/2.1.0-rc.3/node_modules/react-apollo/Query.js.Query.render (overview.js:52184)
    at ProxyComponent.proxiedRender (main.js:38683)
    at finishClassComponent (main.js:30599)
    at updateClassComponent (main.js:30576)
    at beginWork (main.js:30951)
    at performUnitOfWork (main.js:32950)
    at workLoop (main.js:33014)

Comportamiento esperado

Comportamiento real

Una reproducción _simple_

Emitir etiquetas

  • [ ] tiene-reproducción
  • [ ] característica
  • [ ] documentos
  • [ ] bloqueo
  • [ ] buen primer número

Comentario más útil

Nos encontramos con este mismo problema (en Netflix) debido a los proxies que a veces tenemos al frente. Actualmente estamos pensando en envolver fetch para manejar esto de forma reactiva:

const customFetch = (uri, options) => {
  return fetch(uri, options).catch(
    err => {
      // If it's our Content-Type issue from our proxy,
      // reformat the error to match Apollo
      throw new Error(...)
    }
};

const link = createHttpLink({ fetch: customFetch });

o de manera proactiva: hacemos la validación y luego la transmitimos.

Todos 3 comentarios

Protuberancia. Acabo de encontrar lo mismo con el error 501. Error: Network error: Unexpected token N in JSON at position 0 .

Parece que su respuesta no es un JSON válido. Intente verificar lo que su servidor está devolviendo antes de esta línea:

console.log(bodyText);
return JSON.parse(bodyText);

Nos encontramos con este mismo problema (en Netflix) debido a los proxies que a veces tenemos al frente. Actualmente estamos pensando en envolver fetch para manejar esto de forma reactiva:

const customFetch = (uri, options) => {
  return fetch(uri, options).catch(
    err => {
      // If it's our Content-Type issue from our proxy,
      // reformat the error to match Apollo
      throw new Error(...)
    }
};

const link = createHttpLink({ fetch: customFetch });

o de manera proactiva: hacemos la validación y luego la transmitimos.

¿Fue útil esta página
0 / 5 - 0 calificaciones