Node.js 如何根据目录中的文件名创建字符串数组

Node.js How can I create an array of strings based on the file names in a directory

这是伪代码:

var fs = require('fs');   
var _ = require('lodash'); 
var fileNames = []
fs.readdir(dirPath, function(err,list){
    _.forEach(list, function(f){
        fileNames.push(f);
     });
}); 
//Do something with fileNames here

在尝试对文件名做一些事情时,它产生了一个空集合...我该如何设置这段代码,以便我可以使用通过询问特定目录编译的字符串数组

var fs = require('fs');   
var _ = require('lodash'); 
var fileNames = []
fs.readdir(dirPath, function(err,list){
    _.forEach(list, function(f){
        fileNames.push(f);
     });
    //Do something with fileNames here
}); 

您可以随心所欲地执行某些文件 fileNames,并且您的程序应该仍然 运行。问题是 fileNames 将是一个空数组,除非您仅在 fs.readdir 的回调完成后才进行操作

问题是您期望异步调用立即填充变量,但事实并非如此。异步调用return返回回调中的结果;异步调用之后的代码在回调之前执行。你有两种选择来获得你想要的。

您的第一个选择是像您一样使用异步方法,这是推荐的,但请将您的 "do something with fileNames here" 代码放在正确的位置:

var fs = require('fs');
fs.readdir(dirPath, function(err, fileNames) {
    if (err) { /* handle error */ }
    //Do something with fileNames here
});

您的第二个选择是使用同步方法,它已经return满足您的要求:

var fs = require('fs');   
var fileNames = fs.readdirSync(dirPath);
//Do something with fileNames here

请注意,对于 Node,通常首选异步(第一个)方法,但是如果这是在应用程序启动代码或命令行脚本中,您可能会使用同步方法。

另请注意,这些都没有使用下划线。值(回调中的list,或同步方法中的return值)是你想要的列表,你不需要填充到另一个变量中。

你所做的是绝对正确的,除了你在错误的地方处理文件,还有一件事你的 dirPath = undefined

var fs = require('fs');   
var _ = require('lodash'); 
var fileNames = [];
dirPath = './';
fs.readdir(dirPath, function(err,list){
    console.log(list);
    _.forEach(list, function(f){
        fileNames.push(f);
     });
    //Do something with fileNames here
    console.log(fileNames);
});