所以我尝试使用nodejs、express、ejs 和一个名为 ytdl-core 的 API 制作一个 Youtube 视频下载器。我遇到的问题是 有时 req.query 偶尔会返回 undefined 并且会产生此错误
C:\Users\mattm\Desktop\YoutubeVIdeoDownloader pp.js:17 const videoid = req.query.url.split("v=")[1]; ^ 类型错误:无法读取未定义的属性(读取“split”)
但是当它工作时,req.query 返回一个带有“url”键和输入 url 值的对象 { url: 'https://www.youtube.com/watch?v=EuJc-M35-r0' }
其他时候 req.query 返回一个带有 'link' 键和 url 值的对象
我不确定为什么会发生这种情况。我是编码新手,所以可能是我不理解逻辑。如有任何帮助,我们将不胜感激!
const express = require("express");
const ytdl = require("ytdl-core");
const app = express()
app.set("view engine", "ejs");
app.use(express.static("./public", { root: __dirname }));
// home page
app.get("/", (req, res) => {
res.render("index");
});
//download page
app.get("/download", async (req, res) => {
console.log(req.query);
const videoid = req.query.url.split("v=")[1];
const info = await ytdl.getInfo(req.query.url);
console.log(info.formats[1]);
return res.render("download", {
url: "https://www.youtube.com/embed/" + videoid,
info: info.formats.sort((a, b) => {
return a.mimeType < b.mimeType;
}),
});
});
// 404 page
app.use((req, res) => {
res.status(404).render("404");
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>YouTube Downloader</title>
</head>
<body>
<h1 class="heading">My Own YouTube Downloader</h1>
<form method="get" action="/download">
<input type="text" class="URL-input" placeholder="Video URL" name="url" />
<button type="submit" class="convert-button">Convert</button>
</form>
</body>
</html>
我知道它不是随机的,但似乎重置服务器有时似乎可以解决问题。我尝试使用主体解析器而不是查询,但没有成功。
有多种方法可以处理您的给定问题,但这是我对此问题的解决方案。
当 req.query() 为空时,它返回 undefined,并且 split() 方法在未定义的值上运行。因此,首先,我们需要确保 req.query() 包含我们要运行 split() 方法的预期数据。 这样做。
app.get("/download", async (req, res) => {
const reqQuery = req.query;
if (req.query.url) {
const videoid = req.query.url.split("v=")[1];
const info = await ytdl.getInfo(req.query.url);
console.log(info.formats[1]);
return res.render("download", {
url: "https://www.youtube.com/embed/" + videoid,
info: info.formats.sort((a, b) => {
return a.mimeType < b.mimeType;
}),
});
} else {
res.json({
message: "Something went wrong",
error: true
})
}
});
在解决方案中,我没有检查 req.query(),而是检查了实际值。
原因就在这里。当我们尝试检查 req.query() 时,即使它为空, if 块也会被执行。所以一定要检查对象的内部值。
检查对象值时我们不应该在代码中犯的错误。
/* If block will be executed */
const reqQuery = {}
if (reqQuery) {
console.log(true)
} else {
console.log(false)
}
/* Best way */
const reqQuery2 = { url: 'https://dummyurl.com' }
if (reqQuery2.url) {
console.log(true)
} else {
console.log(false)
}