Tengo un backend que devuelve archivos grandes como fragmentos de contenido parcial 206. yo tenia logica:
fetch(url, query) .then((resp)=>resp.json()) .then(...)pero, sorprendentemente, el código falla porque el servidor no devuelve el objeto json completo.
¿Hay alguna biblioteca de uso común para resolver esto (búsqueda de parche de mono) o debería escribir un trabajador de servicio o un proxy para esto? ¿Por qué la fetch predeterminada del navegador no admite la búsqueda del objeto completo?
No sorprende que el análisis de JSON falle en un objeto parcial. fetch solo obtendrá lo que le pidas (bueno, sigue las redirecciones), por lo que si la query tiene opciones para solicitar una respuesta parcial, eso es lo que obtendrás.
Puede construir la cadena JSON hasta que tenga la respuesta completa para analizar, algo así:
async function getAll() { // Start with a blank string let json = ""; do { // Get this chunk const resp = await fetch(url, /*...query for next chunk...*/); if (!resp.ok && resp.status !== 206) { throw new Error(`HTTP error ${resp.status}`); } // Read this chunk as text and append it to the JSON json += await resp.text(); } while (resp.status === 206); return JSON.parse(json); } Obviamente, ese es un boceto aproximado, deberá manejar el encabezado Range , etc.
Ese código también solicita cada fragmento en serie , esperando que llegue el fragmento antes de solicitar el siguiente. Si sabe de antemano cuál es el tamaño del fragmento, es posible que pueda paralelizarlo, aunque será más complicado con los fragmentos que posiblemente lleguen fuera de secuencia, etc.
También asume que el servidor no te lanza una bola curva, como darte un rango más amplio del que pediste que se superpone con lo que ya has recibido. Si esa es una preocupación genuina, deberá agregarle lógica.