读取文件asynchronous

我正在尝试读取一些文件并将其名称存储在nodejs中的数组中。 我做了一个function。 它读取文件,并在控制台中打印出来,但数组的输出是[]。 我假设这是因为node.js是asynchronous的,但我认为callback会解决它?

readCurdir("./uploads/", curDirReadFinn); function readCurdir(dir, callback){ var tmpArray = []; fs.readdir(dir, function(err, files){ if(err){ if(err.code==='EISDIR'){} else{ console.log(err); } return; } files.forEach(function(file){ fs.readFile(dir + file, 'utf-8', function(err, data){ if(err){ if(err.code==='EISDIR'){} else{ console.log(err); } return; } tmpArray.push(file); console.log(file); //this prints }); }); }); callback(tmpArray); } function curDirReadFinn(array){ console.log(array); //Output: [] } 

我也试过这个:

 files.forEach(function(file){ fs.readFile(dir + file, 'utf-8', function(err, data){ if(err){ if(err.code==='EISDIR'){} else{ console.log(err); } return; } tmpArray.push(file); counter++; if(counter === files.lenght){ callback(tmpArray); } }); }); 

你第二次尝试就有正确的想法。 在我简化之后,它完美地工作:

 function readCurdir(dir, callback){ var tmpArray = []; fs.readdir(dir, function(err, files) { if (err) { return console.log(err); } var counter = files.length; files.forEach(function(file) { fs.stat(path.join(dir, file), function(err, stats) { if (err) { console.log(err); } else if (stats.isFile()) { tmpArray.push(file); } --counter === 0 && callback(tmpArray); }); }); }); } 

您可以使用asynchronous模块进一步简化它(更容易传播错误):

 async.each(files, function(file, cb) { fs.stat(path.join(dir, file), function(err, stats) { if (err) { return cb(err); } else if (stats.isFile()) { tmpArray.push(file); } cb(); }); }, function(err) { callback(err, tmpArray) }); 

asynchronous代码再次出现! fs.readdir()是asynchronous的。 您的callback方法与执行fs.readdir()分开调用。 这就是为什么你的tmpArray在你的callback方法curDirReadFinn()logging的时候是空的。

有一些方法可以解决您的问题:

  1. 准备你的目录和文件同步。 NodeJS有这个方法。 看到这里: https : //nodejs.org/api/fs.html#fs_fs_readdirsync_path_options

  2. 正如@Thomas所提到的,你可以使用statisFile()来更快速地完成它。 一般情况下不需要繁重的asynchronous代码。

  3. 使用承诺!