Javascript 同步和递归文件系统文件查找

Javascript 同步和递归文件系统文件查找,javascript,node.js,npm,Javascript,Node.js,Npm,我有一个简单的问题: 我正在使用Node.JS编写一个命令行工具,用JSON模式验证JSON文件。所以,现在我有一个问题,当我想要得到所有的模式,我总是得到“未定义的”使用异步函数,但在其他方面只有同步函数 对于此命令行工具,不需要异步 有人能帮我一下,帮我把它弄得很好吗 var getJSONSchemaFiles = function (dir) { results2 = []; var recursive = require('recursive-readdir');

我有一个简单的问题:

我正在使用Node.JS编写一个命令行工具,用JSON模式验证JSON文件。所以,现在我有一个问题,当我想要得到所有的模式,我总是得到“未定义的”使用异步函数,但在其他方面只有同步函数

对于此命令行工具,不需要异步

有人能帮我一下,帮我把它弄得很好吗

var getJSONSchemaFiles = function (dir) {
results2 = [];


    var recursive = require('recursive-readdir');

    recursive(dir, function (err, files) {
        // Files is an array of filename
      //  console.log(files);

        files.forEach(function (entry) {

            if (entry.indexOf(".schema.json") > -1) {

                results2.push(entry);

            }
        });
        console.log(results2);

    });

        return results2;

};

我正在使用npm“recursive readdir”,但我认为我甚至不需要npm来处理这种事情?

好的,这会同步枚举给定路径下的所有文件:

var fs = require('fs');

function recursiveReaddir(path) {
    var stat = fs.lstatSync(path);
    if(stat.isFile())
        return [path];
    if(!stat.isDirectory())
        return [];
    return [].concat.apply([], fs.readdirSync(path).map(function(fname) {
        return recursiveReaddir(path + '/' + fname);
    }));
}
使用glob模块。有异步和同步方法,如:glob.Sync(pattern,[options]);和glob(模式,[选项]、cb);
他们文档中的示例:

var glob = require("glob")

// options is optional
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames.
  // If the `nonull` option is set, and nothing
  // was found, then files is ["**/*.js"]
  // er is an error object or null.
})

不能从异步函数返回值。请看这个问题:这就是为什么我问如何重新编写我的函数来执行相同的操作,但保持同步?您使用的模块在设计上是异步的。您可能会找到一个利用节点的同步文件I/O方法的方法(如)。逻辑不是超级疯狂,所以我相信你可以自己编写一个脚本来实现你想要的。递归readdir似乎只包含异步版本。必须更改函数才能异步工作:var getJSONSchemaFiles=function(dir,callback)。。。或者使用其他模块。这是一段极其简洁的代码。干得好。如果我只想有“*.json”文件,我该怎么做?@StefanC.:对这个函数的输出应用一个过滤器:
filter(函数(路径){return/\.js$/.test(路径)}
我该如何应用这个过滤器?很抱歉问一下,我是这里的新手-我需要只添加一行代码还是…?我希望如何,进行方法调用并将其存储到变量“data”中?这对async不起作用,还是我错了?修改答案。存在同步方法var files=glob.sync(“*.json”,[options])