[英]javascript JSON.parse throw Unexpected end of JSON input error
[英]JSON.parse() Returning Unexpected end of input
[`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("服务器正在运行")
https.get(url, (response) => {
response.on("data", (data) => {
const TimelineData = JSON.parse(data);
console.log(TimelineData);
})
})
})
app.listen(3000, ()=>console.log("服务器正在运行 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"));
以有效的方式传递大数据 API 以块/流格式发送数据。 并接收每个块,它会触发“数据”事件,在您的情况下,API 可能会以块格式发送数据。 并且它不会在单个事件中向您发送完整的数据。
假设您的 API 的完整响应是: { name: 'bella', age: 34, count: 40138 }
API 分两部分发送:
{ name: 'bella', age: 34, count: 4013
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"));
“数据”事件可以多次触发: 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"));
为什么要使用 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);
})
})
})
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
。 output 将......
听'end'问题就解决了
尝试导入所有依赖项。 导入比要求更好,因为您可以有选择地只加载您需要的部分。 同样在 package.json 文件中,在脚本前添加“type”:“module”。 由于新的 ESM 模块,const something= require('something') 的日子已经成为过去。
import express from 'express';
import https from 'https';
const app=express();
const port=3000;
在 package.json 文件中
"name": "restApiWithNode",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
为了清楚起见,请阅读这篇文章https://formidable.com/blog/2021/node-esm-and-exports/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.