我正在尝试使用 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 不喜欢“数据”,对我来说,我只需将 var 更改为 reponseText,现在一切都很好。
永远不会知道