Búsqueda de sitios web

javascript - Error: SyntaxError: Fin inesperado en la entrada JSON al usar fetch()


Estoy jugando con el envío de JSON entre un servidor API en Go y un front-end basado en React. Estoy recibiendo el siguiente error:

Error: SyntaxError: Fin inesperado de la entrada JSON

Está diciendo que esto ocurre en la línea 25, que es

.then(response => response.json())

Esta es la función relacionada:

postData() {
fetch('stuff/', {
  method: 'POST',
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Bob',
    age: 53,
  })
})
.then(response => response.json())
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));
}

Después de intentar algunas soluciones, agregué la captura de errores a la función con las salidas "success" y "error", para que al menos dejara de aparecer la página de error, y añadí algunas salidas en la consola del servidor API para ver si los datos estaban siendo pasados.

Aparte del error que ocurre, todo parece estar funcionando como se esperaba. El servidor API de Go está recibiendo los datos en json y puedo deserializarlos en una estructura y escribir los datos en la consola sin problemas, así que sé que los datos se están transmitiendo. No se están produciendo errores en el lado de Go de la operación.

¿Tengo problemas para averiguar qué puede estar causando el error? Busco algunas sugerencias sobre cómo podría continuar solucionando esto o resolver el error.

ACTUALIZACIÓN: Como sugirió Dale, he puesto .then(response => console.log(response)) en mi código. Reemplacé el .then estándar (response => response.json()) con este código. A continuación se muestra una captura de pantalla de la consola de las herramientas de desarrollo de Chrome.

También puede valer la pena señalar que el código de error no aparece en este caso. ¿Podría el error estar en el código Go del lado del servidor? A continuación se muestra el manejador para el endpoint POST

func handlePostTest(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
    fmt.Print(err.Error())
}
var aPerson Person
json.Unmarshal(body, &aPerson)
fmt.Print(" ", aPerson.Name, " ", aPerson.Age)
}

Respuesta #1

Por el mensaje de error y la respuesta HTTP, es evidente que si estás usando la API fetch y devolviendo HTTP 200 desde el lado del servidor, entonces deberías enviar algún contenido como "OK", de lo contrario devolverá una cadena vacía y si usas .json() sobre la respuesta, producirá un error ya que no es un JSON válido. Si no estás enviando ningún contenido, envía HTTP 204 desde el lado del servidor (sin contenido).

Entonces, en tu caso deberías enviar algo de contenido desde el lado del servidor.