Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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
Node.js Nodejs,如何在Nodejs中复制多个文件而不崩溃_Node.js_Http_Stream_File Copying - Fatal编程技术网

Node.js Nodejs,如何在Nodejs中复制多个文件而不崩溃

Node.js Nodejs,如何在Nodejs中复制多个文件而不崩溃,node.js,http,stream,file-copying,Node.js,Http,Stream,File Copying,我试图用node js复制几个文件 以下是我正在尝试做的一个例子: var request = require('request'); va photos [{ 'url': 'http://xxxx.com/im1', 'name' : 'name1' }, { 'url': 'http://xxxx.com/im12', 'name' : 'name2' }, for (var i = 0; i < photos.length; i++) {

我试图用node js复制几个文件

以下是我正在尝试做的一个例子:

var request = require('request');
 va photos [{ 'url': 'http://xxxx.com/im1', 'name' : 'name1' }, { 'url': 'http://xxxx.com/im12', 'name' : 'name2'    }, 
 for (var i = 0; i < photos.length; i++) {
                        request(photos[i].source).pipe(fs.createWriteStream(photos[i].name));
  }
在复制了大约100个文件后,我仍然崩溃。我确信async.while和async.eachSeries是weel,因为我的日志显示每个调用都在序列中。但是我撞车了。我临时解决了这个问题,每次拷贝后都会像这样等待:

async.whilst(function () { return !stop; },
                function (callback) {
                    console.log("get next 20 image");
                    JM.api('/' + album.id + '/photos', { after: next }, function (resf) {
                        if (!resf || resf.error) {
                            console.log(!resf ? 'error occurred' : resf.error);
                        }
                        console.log("albums" + album.id + " " + resf.data.length + " dir" + dir);

                        async.eachSeries(resf.data, function (photo, done) {

                            request(photo.source).pipe(fs.createWriteStream(dir + "/" +photo.name));
                            console.log("copy of image " + img_basename);
                        }, function (err) {
                            if (err) {
                                console.log('An images failed to copy');
                            } else {
                                console.log('All 20 image have been copied successfully');
                            }
                            if (resf.paging && resf.paging.cursors) {
                                console.log("suite de l'album à venir");
                                next = resf.paging.cursors.after;
                                setTimeout(function () { callback(); }, 5000);
                            }
                            else {
                                console.log("Fin de l'album");
                                stop = true;
                                setTimeout(function () { callback(); }, 5000);
                            }
                        });
                    });
                },
                function (err) {
                    if (err) {
                        console.log('An images failed to process');
                        albumcallback();
                    } else {
                        console.log('All images in this group have been processed successfully');
                        albumcallback();
                    }
                }
            );// end while
request(photo.source).pipe(fs.createWriteStream(dir + "/" + img_basename));
                            console.log("copy of image " + img_basename);
                            setTimeout(function () { done(); }, 5000);

这是请求模块的限制吗?如何更改此fea行以确保在继续程序之前关闭每个连接?

您可能需要转到异步循环。类似模块中的内容可能是理想的

async.eachLimit(photos, 10, function(photo, done) {
    var r = request(photos[i].source).pipe(fs.createWriteStream(photos[i].name));
    r.on('finish', done);
}, function(err) {
    // All images done or there was an error
});

现在它将处理照片列表中的所有项目,但只同时处理其中的10个项目。这将防止它启动数百或数千个并发传出连接。

请求调用和管道调用是异步的。所以我必须重写这一行:request(photos[i].source).pipe(fs.createWriteStream(photos[i].name))

请看这里:

你好。谢谢你的问候。我还需要一个信息,因为我的代码有点复杂。我不能在一个电话里得到我所有的照片,所以我已经在一种循环中,我得到我的照片20乘20。所以如果我每次给asyn打几次电话,它会成功吗?或者它不会序列化调用?提前谢谢。如果你要传递数百件要处理的事情,并且你想限制它们的处理速度,我建议每个限制。它将基本上取代你试图做的事情,把它们分成几组照片。如果要保持组设置,可以在外部循环中使用eachSeries。这意味着它只在第一组图片完成后处理第二组图片。谢谢我会试试看。我不能那样做,因为,为了获取我的照片列表,我正在做一些类似于:http.get('www.xxx.com'/path)的事情,而获取我接下来20张照片的路径是在我上一次呼叫的响应中。所以我没有一份清单可以传给每个人。也许有了until和url的一个全局变量?Async似乎是一个很好的anwser。我将查看库并更改代码。