1

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

谢谢!

测试.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>
4

1 回答 1

1

问题是async.forEach === async.eachasync.each()并行调用迭代器。你想要的是async.eachSeries()代替。

于 2014-04-17T17:38:39.247 回答