【问题标题】:Downloading multiple files from url using NodeJs使用 NodeJs 从 url 下载多个文件
【发布时间】:2021-09-01 16:47:27
【问题描述】:

我正在尝试从 CDN 服务器下载 10,000 多张图片。但是,当我使用以下代码时,脚本只会创建一堆空文件,并且只下载最后一个文件。我还收到了很多错误,包括 MaxListenersExceededWarning 和 EMFILE,打开的文件太多。如何解决这个问题呢?谢谢。

const http = require('https'); // or 'https' for https:// URLs
const fs = require('fs');

for (let i = 1; i <= 500; i++) {

var random = Math.floor(Math.random() * 1497791);
var url = "https://cdnpath.com" + random + ".png";
//var dest = "D:/SavePath/" + random + ".png";

    var file = fs.createWriteStream("D:/SavePath/#" + i + ".png");
    var request = http.get(url, function(response) {
        response.pipe(file).end();
    });
setTimeout(sleep, 3000);
}

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    我只包含相关代码。问题是异步函数在继续执行之前不会阻塞等待结束的执行线程。这使您的 var i 将在循环中递增,并在异步操作结束所需的更短的时间内以 500 的值结束,因此最后您只写最后一个文件内容

    这可能会解决您的问题

    const saveFile = (counter, rndNumber) => {
        var url = "https://cdnpath.com" + random + ".png";
        var file = fs.createWriteStream("D:/SavePath/#" + counter + ".png");
        http.get(url, function(response) {
                response.pipe(file).end();
        });
    }
    for (let i = 1; i <= 500; i++) {
        var random = Math.floor(Math.random() * 1497791);
        saveFile(i, random);
    }
    

    这可能会导致服务器出现过载问题,因此您可以在代码中使用 async/await 或 Promise 来做一个更好的方法,这样您就可以限制对服务器的并发调用数。

    【讨论】:

    • 试过这个解决方案,但得到错误 [ERR_STREAM_WRITE_AFTER_END]: write after end at WriteStream.Writable.write (internal/streams/writable.js:292:11) at IncomingMessage.ondata (internal/streams/readable .js:726:22) 在 IncomingMessage.emit (events.js:400:28) 在 IncomingMessage.Readable.read (internal/streams/readable.js:500:10) 在流 (internal/streams/readable.js: 982:34)
    • 我编辑了示例,看起来 fs.createWriteStream 也是一个异步函数,您必须等待创建完成才能调用 url 并写入响应。如果您在代码中提供一个 jsfiddler 工作示例,会更容易提供帮助
    • TypeError: fs.createWriteStream(...).then is not a function at saveFile (D:\Minecraft\app.js:7:63)
    • 我的变量 i 出错了,你现在可以试试吗? replit.com/languages/nodejs我在这里测试过,似乎可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多