我有一些代码循环遍历目录并检索每个文件的文件名。然后代码检索每个文件的内容(通常是数字或短文本)。
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));
答案 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);
});
}
});
});
});
}
,而不是编写自己的walk
实现