Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用node.js的YouTube下载程序_Javascript_Node.js - Fatal编程技术网

Javascript 使用node.js的YouTube下载程序

Javascript 使用node.js的YouTube下载程序,javascript,node.js,Javascript,Node.js,所以我使用node.js创建YouTube下载程序。问题是我运行代码后已经创建了文件,但是文件是0kb,并且打印成功。我想要的是,当我成功下载视频时,程序必须打印成功,也不能创建文件。该文件必须在一个视频成功下载后创建 const播放列表=[ { 标题:“什么是DevOps”, 视频URL:“https://www.youtube.com/watch?v=mBBgRdlC4sc", }, { 标题:“DevOps简介”, videoId:“Me3ea4nUt0U”, 视频URL:“https:

所以我使用node.js创建YouTube下载程序。问题是我运行代码后已经创建了文件,但是文件是0kb,并且打印成功。我想要的是,当我成功下载视频时,程序必须打印成功,也不能创建文件。该文件必须在一个视频成功下载后创建

const播放列表=[
{
标题:“什么是DevOps”,
视频URL:“https://www.youtube.com/watch?v=mBBgRdlC4sc",
},
{
标题:“DevOps简介”,
videoId:“Me3ea4nUt0U”,
视频URL:“https://www.youtube.com/watch?v=Me3ea4nUt0U",
},
{
标题:“DevOps初学者教程”,
videoId:“YSkDtQ2RA_c”,
视频URL:“https://www.youtube.com/watch?v=YSkDtQ2RA_c",
},
];
常数fs=要求(“fs”);
常量ytdl=需要(“ytdl核心”);
常量长度=playlist.length;
playlist.forEach((pl,i)=>{
const{videoUrl,title}=pl;
常数项=i+1;
ytdl(视频URL{
格式:“mp4”,
}).pipe(fs.createWriteStream(`${title}.mp4`));
log(`${item}/${length}-${title}下载成功`);
});在编写完成之前,您正在记录“下载成功”。你有一些可能性。人们可能正在“WriterStream”上收听某些事件

从文档中:

//创建可写流
const writeableStream=fs.createWriteStream(`${title}.mp4`);
//正在侦听“完成”事件
writeableStream.on('finish',()=>{
log(`${item}/${length}-${title}下载成功`);
});
//将其插入ReadableStream
ytdl(视频URL{
格式:“mp4”,
}).管道(可写流);

现在,这将在写入开始时创建一个新文件。我建议使用一个临时名称,如
filename.temp.mp4
,然后在完成编写后重命名它。

Hey@kennethreyt!一旦进程开始将/写入文件,就会创建该文件。你通常看到的是“临时”文件的使用。同一个文件,但带有前缀,例如“temp_filename”或“filename.temp.mp4”。一旦完成,它将被重命名。另一方面,您正在处理异步代码。在写作结束之前,您正在记录“成功”。非常感谢您,先生,我感谢您的评论。我将在成功下载视频+1后重命名它。另一方面,如果与问题中的
.forEach
一起使用,这将并行下载所有视频。要以系列方式下载它们,可以使用
for
循环和async/await:非常感谢,先生,非常感谢您的评论。我将尝试在成功下载后重命名该文件。我可以提供帮助