繁体   English   中英

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

[英]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 分两部分发送:

  • Chunk1: { 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"));

“数据”事件可以多次触发: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM