Node.js连接文件

时间:2014-04-17 17:22:45

标签: node.js node.js-stream

我正在尝试连接多个文件并使用节点js createWriteStreamcreateReadStream保存到新文件。我有一个小错误,我想在其内容之前打印出文件名。但是,文件名始终打印在输出文件的顶部。请查看我的结果输出,如果您有任何想法,请提供帮助!

谢谢!

test.js

var async = require('async');
var fs = require('fs');
var path = require('path');

var SOURCE_FOLDER = '/tmp/test';
var SOURCE_FILE_PATTERN = /\.json$/
var REPORT_FILE = path.join(SOURCE_FOLDER, 'output.html');

var writeStream = fs.createWriteStream(REPORT_FILE, {
  flags: 'w',
  encoding: 'UTF-8'
});

var appendReport = function appendReport(file, callback) {
  var readStream = fs.createReadStream(file, {
    flags: 'r',
    encoding: 'UTF-8'
  });

  readStream.pipe(writeStream, {
    end: false
  });

  readStream.on('end', callback);
};

fs.readdir(SOURCE_FOLDER, function (err, files) {
  if (err) {
    console.log(err);
  } else {
    writeStream.write("<html><body><pre>\n");

    async.forEach(files, function (file, callback) {
      var filePath = path.join(SOURCE_FOLDER, file);

      fs.stat(filePath, function (err, stats) {
        if (err) {
          callback(err);
        } else if (stats.isFile() && file.match(SOURCE_FILE_PATTERN)) {
          writeStream.write("\n" + filePath);
          appendReport(filePath, callback);
        } else {
          callback();
        }
      });
    }, function (err) {
      writeStream.write("\n</pre></body></html>");
    });
  }
});

我目前的结果:

# node test.js; cat /tmp/test/output.html 
<html><body><pre>

/tmp/test/a.json
/tmp/test/b.jsoncontent A
content B

</pre></body></html>

我的预期结果:

# node test.js; cat /tmp/test/output.html 
<html><body><pre>

/tmp/test/a.json
content A

/tmp/test/b.json
content B

</pre></body></html>

1 个答案:

答案 0 :(得分:1)

问题是async.forEach === async.eachasync.each()并行调用迭代器。你想要的是async.eachSeries()而不是。{/ p>