El encabezado de aceptación predeterminado se establece en */*
:
Pero asumimos incorrectamente que la respuesta es json e intenta JSON.parse(bodyText)
, sin verificar el tipo de contenido de bodyText
.
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
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.
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:
o de manera proactiva: hacemos la validación y luego la transmitimos.