nodejs表示fs将文件迭代到数组或对象失败

thr*_*801 7 node.js express

所以我试图使用nodejs表达FS模块迭代我的应用程序中的目录,将每个文件名存储在一个数组中,我可以将其传递给我的快速视图并遍历列表,但我很难这样做.当我在files.forEach函数循环中执行console.log时,它打印文件名就好了,但是一旦我尝试做任何事情,例如:

var myfiles = [];
var fs = require('fs');
fs.readdir('./myfiles/', function (err, files) { if (err) throw err;
  files.forEach( function (file) {
    myfiles.push(file);
  });
});
console.log(myfiles);
Run Code Online (Sandbox Code Playgroud)

它失败了,只记录一个空对象.所以我不确定究竟发生了什么,我认为它与回调函数有关,但是如果有人能够告诉我我做错了什么,以及为什么它不工作,(以及如何使其工作),它将是非常感激.

Rob*_*sch 31

myfiles数组为空,因为在调用console.log()之前尚未调用回调.

你需要做的事情如下:

var fs = require('fs');
fs.readdir('./myfiles/',function(err,files){
    if(err) throw err;
    files.forEach(function(file){
        // do something with each file HERE!
    });
 });
 // because trying to do something with files here won't work because
 // the callback hasn't fired yet.
Run Code Online (Sandbox Code Playgroud)

请记住,节点中的所有内容同时发生,在某种意义上,除非您在回调中进行处理,否则您无法保证异步功能已经完成.

解决这个问题的一种方法是使用EventEmitter:

var fs=require('fs'),
    EventEmitter=require('events').EventEmitter,
    filesEE=new EventEmitter(),
    myfiles=[];

// this event will be called when all files have been added to myfiles
filesEE.on('files_ready',function(){
  console.dir(myfiles);
});

// read all files from current directory
fs.readdir('.',function(err,files){
  if(err) throw err;
  files.forEach(function(file){
    myfiles.push(file);
  });
  filesEE.emit('files_ready'); // trigger files_ready event
});
Run Code Online (Sandbox Code Playgroud)

  • +1深入挖掘并解释你应该如何使用回调. (3认同)

Dav*_*ang 5

fs.readdir是异步的(与node.js中的许多操作一样).这意味着该console.log行将在readdir有机会调用传递给它的函数之前运行.

你需要:

将该console.log行放在给定的回调函数中readdir,即:

fs.readdir('./myfiles/', function (err, files) { if (err) throw err;
  files.forEach( function (file) {
    myfiles.push(file);
  });
  console.log(myfiles);
});
Run Code Online (Sandbox Code Playgroud)

或者只是对内部的每个文件执行一些操作forEach.


Aut*_*ico 5

正如一些人提到的,您使用的是异步方法,因此您有一个不确定的执行路径。

但是,有一个简单的方法可以解决这个问题。只需使用该方法的同步版本:

var myfiles = [];
var fs = require('fs');

var arrayOfFiles = fs.readdirSync('./myfiles/');

//Yes, the following is not super-smart, but you might want to process the files. This is how:
arrayOfFiles.forEach( function (file) {
    myfiles.push(file);
});
console.log(myfiles);
Run Code Online (Sandbox Code Playgroud)

这应该可以正常工作。但是,使用同步语句并不好,因此除非同步非常重要,否则您不应该这样做。

在此处阅读更多信息:fs.readdirSync