为什么我的node.js应用程序在尝试对来自youtube api的传入数据使用JSON.parse(data)时崩溃?

问题描述 投票:0回答:1

我正在尝试使用 youtube api 通过带有搜索框和搜索按钮的简单前端来搜索视频。

我使用标准的 https.get() 方法来实现这一点。 我遇到的问题是,一旦数据到达response.on()代码块内,我通常会对该数据使用JSON.parse,并存储在另一个变量中,我将在其中拥有可用的javascript对象。

结果是应用程序崩溃并在控制台中出现以下错误:

undefined:25 "url": "https://i.ytimg.com/vi/fWRISvAygU/ SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>) at IncomingMessage.<anonymous>
和标准
[nodemon] app crashed - waiting for file changes before starting...

我可以确认的是:

-我尝试在邮递员中获取该数据(粘贴到邮递员中的完全相同的网址),并且我确实像往常一样收到了长json格式

-我已经确认我从前端获取的数据正在转换为非常适合 url 的字符串 -我有控制台在 https.get() 方法中记录了状态代码,我得到了 200ok

-我已控制台记录了 response.on("data", function(data){}) 内的(数据) 还没有解析它,我就得到了缓冲区数据

<Buffer 7d 0a 20 20 22 6b .... bla bla

注意:我确实必须注意一些重要的事情:我之前只对一个项目(从天气 API 获取天气数据)和我的另一个项目的代码中做过此操作,该项目工作得很好,我看到的唯一区别是我在 JSON.parse() 应用于传入数据之前获得的缓冲区数据,该缓冲区数据只有一个序列。这意味着这是一次射击

<Buffer 7d 0a 20 20 22 6b bla bla more bytes>
我试图在当前项目中检索的当前数据来自 5 个不同的缓冲区数据块。当我在尝试 JSON.parse() 之前通过控制台记录数据时,我可以看到该缓冲区数据的 5 个不同的开始和结束标签。

如果我在这里没有使用很好的术语,请原谅我,因为这是我编码的第 6 个月,而且我还处于这个旅程的早期阶段。我刚刚开始涉足 Node.js 的 API

const express = require("express");
const bodyParser = require("body-parser");
const https = require("https");
const Joi = require("joi");
const apiKey = "MyKeyWouldBeHere"; (hiding it)

const app = express();

app.use(bodyParser.urlencoded({extended:true}));
app.use(express.static("public"));





app.get("/", (req, res) => {
    res.sendFile(`${__dirname}/index.html`);
});

app.post("/videos", (req, res) => {
    const {error} = validation(req.body);
    if (error) return res.status(400).send("wrong way to write");

    
    const userInput = req.body.userInput;

    https.get(`https://www.googleapis.com/youtube/v3/search?part=snippet&key=${apiKey}&q=${userInput}`, (response) => {
        
        console.log(response.statusCode);

        response.on("data", function(data) {
            const weatherData = JSON.parse(data);
            console.log(data);

        });
    });


});


app.listen("3000", () => {
    console.log("Running server on port 3000");
});


function validation(value) {
    const schema = Joi.object({
        userInput: Joi.string().min(2).required()
    });
    return schema.validate(value);
}
javascript node.js youtube-api get-request
1个回答
0
投票

这也发生在我身上,显然,Javascript 不喜欢“数据”,对我来说,我只需将 var 更改为 reponseText,现在一切都很好。

永远不会知道

© www.soinside.com 2019 - 2024. All rights reserved.