JSON.parse()返回输入的意外结束

Posted

技术标签:

【中文标题】JSON.parse()返回输入的意外结束【英文标题】:JSON.parse() Returning Unexpected end of input 【发布时间】:2020-11-18 17:21:45 【问题描述】:

[`const express = require('express'); 常量应用程序 = 快递(); const https = require('https');

const url = "https://api.thevirustracker.com/free-api?countryTimeline=US";

app.get("/", (req ,res) => res.send("服务器正在运行")

https.get(url, (response) => 
    
    response.on("data", (data) => 

        const TimelineData = JSON.parse(data);
        console.log(TimelineData);
        
    )
)

)

app.listen(3000, ()=>console.log("Server is Running 0n 5000"));`]1

const express = require('express');
const app = express();
const https = require('https');

const url = "https://api.thevirustracker.com/free-api?countryTimeline=US";

app.get("/", (req ,res) => 
    res.send("Server is Running")

    https.get(url, (response) => 
        
        response.on("data", (data) => 

            const TimelineData = JSON.parse(data);
            console.log(TimelineData);
            
        )
    )
)



app.listen(3000, ()=>console.log("Server is Running 0n 5000"));

【问题讨论】:

欢迎来到 ***!为了得到准确的答案,你应该写下你的目标是什么,什么问题让你卡住了,附上感兴趣的代码部分(全格式,不仅是某些部分),并解释你试图解决问题的方法跨度> response.on("data", (data).... 不是全身响应。它可以被触发多次,您必须将所有块连接在一起以获得完整的响应。 “数据”是一个无效的 json 字符串,因为它被分割成多个块。监听“结束”事件并在那里进行 json 解析。 如果您想要正确答案,请提供 JSON 的样子。 @hackKaTun3s i.stack.imgur.com/YeqWy.png 如果您检查控制台@soumeshkumar 数据未满。检查结尾。 【参考方案1】:
const express = require('express')
const app = express()

const port = 3000

app.post('/', (req, res) =>  
  res.send('Hello World!")

)

app.listen(port, () => 
  console.log('server running')

)

在 nodejs 中运行程序时,打开浏览器并输入http://localhost:3000。输出将是....

【讨论】:

嗨,IjajAhmed Jaman。你还是editing,不是吗?请将此作为指导How to Answer,并在您方便的时候使用tour。 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。 看起来您的输出意外结束。我已经为语法编辑了这个。能说完最后一句话吗?【参考方案2】:

为了以有效的方式传递大数据,API 以块/流格式发送数据。并接收每个块,它会触发 'data' 事件,在您的情况下,API 可能会以块格式发送数据。它不会在单个事件中向您发送完整的数据。

假设您的 API 的完整响应是: name: 'bella', age: 34, count: 40138

API 分两块发送:

块1: name: 'bella', age: 34, count: 4013 块2:8

在这种情况下,Chunk1 或 Chunk2 上的 Json.Parse() 将不起作用并引发异常。

要处理这个问题,你需要监听 'end' 事件并从 'data' 捕获数据并在 'end '事件。

使用下面的代码:

const express = require('express');
const app = express();
const https = require('https');

const url = "https://archive.org/advancedsearch.php?q=subject:google+sheets&output=json";

app.get("/", (req, res) => 
  res.send("Server is Running")

  https.get(url, (response) => 
    var responseData = '';

    response.on("data", (dataChunk) => 
      responseData += dataChunk;

    )

    response.on('end', () => 
      const TimelineData = JSON.parse(responseData);
      console.log(TimelineData);
    );

  ).on('error', (e) => 
    console.error(e);
  );
)



app.listen(5000, () => console.log("Server is Running 0n 5000"));

【讨论】:

【参考方案3】:

你为什么使用 https? 将 https 替换为 http 并再次运行。

const express = require('express');
const app = express();
const http = require('http');

const url = "https://api.thevirustracker.com/free-api?countryTimeline=US";

app.get("/", (req ,res) => 
    res.send("Server is Running")

    http.get(url, (response) => 
        
        response.on("data", (data) => 

            const TimelineData = JSON.parse(data);
            console.log(TimelineData);
            
        )
    )
)

【讨论】:

【参考方案4】:

“数据”事件可以多次触发:https://nodejs.org/api/http.html#http_class_http_clientrequest

您必须侦听“结束”事件并将“数据”事件中的所有块连接在一起以获得完整的正文响应。

const express = require('express');
const app = express();
const https = require('https');

const url = "https://api.thevirustracker.com/free-api?countryTimeline=US";

app.get("/", (req, res) => 

    res.send("Server is Running")

    https.get(url, (response) => 

        const chunks = [];

        response.on("data", (data) => 
            chunks.push(data);
        )

        response.on("end", () => 

            let size = chunks.reduce((prev, cur) => 
                return prev + cur.length;
            , 0);

            let data = Buffer.concat(chunks, size).toString();

            console.log(JSON.parse(data))

        );

    )

)



app.listen(3000, () => console.log("Server is Running 0n 5000"));

【讨论】:

以上是关于JSON.parse()返回输入的意外结束的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 SyntaxError:JSON.parse (<anonymous>) 处的 JSON 输入意外结束

SyntaxError:JSON.parse (<anonymous>) 处的 JSON 输入意外结束

DiscordJS + NodeJS:SyntaxError:JSON.parse 处的 JSON 输入意外结束(<anonymous>)

Angular2 HTTP POST发生错误SyntaxError:JSON输入意外结束

XAMPP 返回错误“JSON 输入意外结束”

Void SpringMVC Ajax 控制器上的“JSON 输入意外结束”