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>)