SyntaxError: Неожиданное завершение ввода JSON (Node.js )

#javascript #json #api #syntax

#javascript #json #API #синтаксис

Вопрос:

Я новый разработчик, изучающий, как работать с API, и я уже несколько раз сталкивался с этой ошибкой, которая продолжает приводить к сбою узла:

 SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
    at IncomingMessage.<anonymous> (/Users/SA/Desktop/pokeApp/app.js:13:34)
    at IncomingMessage.emit (events.js:314:20)
    at IncomingMessage.Readable.read (_stream_readable.js:513:10)
    at flow (_stream_readable.js:986:34)
    at resume_ (_stream_readable.js:967:3)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
  

Я не совсем уверен, как это решить или в чем именно проблема … мой JS-код выглядит следующим образом:

 const express = require("express");
const https = require("https");

const app = express();

app.get("/", (req,res) => {
    const url = "https://pokeapi.co/api/v2/pokemon/1/";

    https.get(url, function(response){
        console.log(response.statusCode);

        response.on("data", (data) =>{
            const pokemon = JSON.parse(data);
            console.log(pokemon);
        })
    })

    res.send("server running");
})

app.listen(3000, () => {
    console.log("Port 3000");
})
  

Это в основном та же настройка, которую я использовал для weatherAPI, и у меня не было никаких проблем.
Я также проверил JSON с помощью JSON lint, чтобы увидеть, были ли какие-либо проблемы, и все вернулось в порядке.

Ответ №1:

Вам нужно дождаться получения полного ответа — это большой файл, поэтому он может прийти не весь сразу:

 https.get(url, function(response){
    let result = '';
    response.on("data", (data) =>{
        result  = data;
    });
    response.on('end', () => {
        const pokemon = JSON.parse(result);
        console.log(pokemon);
    });
})
  

Комментарии:

1. Спасибо! Это сработало. Просто вопрос, почему добавление данных в первом ответе.on в пустую строку позволило мне проанализировать JSON, когда ответ «заканчивается»? Я пробовал метод JSON.stringify(), но он работал по-другому.

2. data Событие запускается несколько раз, а не только один раз, поскольку полезная нагрузка большая, поэтому, объединив все data вместе, оно может быть JSON.parse общим в конце

3. отлично! теперь это имеет гораздо больше смысла.