如何使用Node.js中的大量文件和流?

时间:2013-09-12 23:50:39

标签: node.js

我正在开发一个小节点项目,需要复制和解压缩各种大小的文件。我一直在尝试使用async.eachSeries来处理它,但它没有成功。这些文件已经创建,但是输出的文件最终写入多个不同的文件,无论它应该以哪个文件结束。

     fs.readdir(path, function (err, files) {
       async.eachSeries(files, function (file, callback) {
         var wr = fs.createWriteStream(file);
         fs.stat(file, function (err, stats) {
           if (err) throw err;
           var stream = fs.createReadStream(file).on('end', function () {
             callback();
           }).pipe(ungzip).pipe(wr);
      });
    }, function () {
      //res.write(concatenated);
      //res.end();
    });
  });

我还是节点新手,所以任何帮助都会受到赞赏。

-NQ

1 个答案:

答案 0 :(得分:2)

看起来解决方案是使用闭包。

代码中的问题是传递给fs.stat的回调函数引用了外部作用域的变量,即wr,它在循环的下一次迭代中被更改。关闭是很好的解决方法。

fs.readdir(path, function (err, files) {
   async.eachSeries(files, function (file, callback) {
       var wr = fs.createWriteStream(file);
       fs.stat(file, function(myWr){
           return function (err, stats) {
               if (err) throw err;
               var stream = fs.createReadStream(file).on('end', function () {
                   callback();
               }).pipe(ungzip).pipe(myWr);
           }
       }(wr));
   }, function () {
   //res.write(concatenated);
   //res.end();}
   });
});

有关闭包的详情,请参阅Please explain the use of JavaScript closures in loopsServing A Batch Of Dynamic Pages