JSON

时间:2015-07-07 12:44:49

标签: javascript json node.js

我有一些代码循环遍历目录并检索每个文件的文件名。然后代码检索每个文件的内容(通常是数字或短文本)。

var config = {};
config.liveProcValues = {};


var path = require('path');
walk = function(dir, done) {
var results = {};
fs.readdir(dir, function(err, list) {
    if (err) return done(err);
    var pending = list.length;
    if (!pending) return done(null, results);
    list.forEach(function(file) {
        file = path.resolve(dir, file);
        fs.stat(file, function(err, stat) {
            if (stat && stat.isDirectory()) {
                walk(file, function(err, res) {
                    results = results.concat(res);
                    if (!--pending) done(null, results);
                });
            } else {


                fs.readFileSync(file, 'utf8', function(err, data) {

                    if (err) {
                        contents = err;
                    } else {
                        contents = data;
                    }

                        console.log(filename + " - " + contents);


                    filename = file.replace(/^.*[\\\/]/, '');
                    config.liveProcValues[filename] = contents;


                });

console.log行成功输出正确的信息,但是在尝试将其存储到JSON中时:

  config.liveProcValues[filename] = contents;

它只记得这些信息。

walk("testdirectory", function(err, results) {
   if (err) throw err;
});

// Output the configuration
console.log(JSON.stringify(config, null, 2));

1 个答案:

答案 0 :(得分:0)

您必须确保在遍历文件系统后访问数据。为此,您必须将console.log 移动到 walk回调中:

walk("testdirectory", function(err, results) {
  if (err) throw err;

  // Output the configuration
  console.log(JSON.stringify(results, null, 2));
});

有关详细信息,请参阅Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

但是,由于您的代码中存在一些逻辑错误,因此无法解决此问题。您正在尝试将对象视为数组(results.concat)并且在完成后并不总是调用done(特别是在您阅读完之后没有调用done目录中的文件。)

这是一个应该更接近你想要的版本。

这使用Object.assign来合并两个对象,这在Node中是不可用的,但您可以找到提供相同功能的模块。

请注意,我还删除了整个config对象。如果您使用results,它会更干净。

var path = require('path');
function walk(dir, done) {
  var results = {};
  fs.readdir(dir, function(err, list) {
    if (err) return done(err);
    if (!list.length) return done(null, results);

    var pending = list.length;
    list.forEach(function(file) {
      file = path.resolve(dir, file);
      fs.stat(file, function(err, stat) {
        if (stat && stat.isDirectory()) {
          walk(file, function(err, res) {
            if (!err) {
              // Merge recursive results
              Object.assign(results, res);
            }
            if (!--pending) done(null, results);
          });
        } else {
          fs.readFile(file, 'utf8', function(err, data) {
            var contents = err || data;
            console.log(file + " - " + contents);
            file = file.replace(/^.*[\\\/]/, '');
            // Assign the result to `results` instead of a shared variable
            results[file] = contents;
            // Need to call `done` if there are no more files to read
            if (!--pending) done(null, results);
          });
        }
      });
    });
  });
}

但您可以use an existing package

,而不是编写自己的walk实现