Javascript 使用require all从目录和子目录递归加载文件

Javascript 使用require all从目录和子目录递归加载文件,javascript,recursion,path,Javascript,Recursion,Path,我希望与特定条件匹配的目录和子目录中有json文件,但是我不知道如何使用子目录 我正在使用查找json文件: const reqAll = require('require-all')({ dirname: __dirname + '/resource', filter: /(.+)\.json$/, recursive: true }); 我的文件树如下所示: MyDir - file1.json - SubDir -- file2.json 打印reqAll将输出: {

我希望与特定条件匹配的目录和子目录中有json文件,但是我不知道如何使用子目录

我正在使用查找json文件:

const reqAll = require('require-all')({
  dirname: __dirname + '/resource',
  filter: /(.+)\.json$/,
  recursive: true
});
我的文件树如下所示:

MyDir
- file1.json
- SubDir
-- file2.json
打印
reqAll
将输出:

{ 
  file1: { 
    path: /first,
    body: ...some body
  },
  SubDir: { 
    file2: { 
      path: /second,
      body: ...some body
    } 
  } 
}

我最初使用下面的过滤器来删除数据,因为我最初不使用子目录,但现在这样做是有意义的

let source = Object.values(reqAll).filter(r => {
    return r.path === req.url;
}
其中
req.url
是我正在发送的http请求的url。ie:
localhost:8080/first
,这样它将与我目录中的
file1
文件匹配

问题是,当我提交
localhost:8080/秒
时,我没有得到响应,因为我无法匹配到
file2
,因为这在子目录中。同时发送
localhost:8080/SubDir/file2
也不起作用


有什么办法可以让这一切顺利进行吗?

在您写的评论中:

因此,我将首先执行一个httpget-on,localhost:8080/first,它将返回file1对象的主体。这实际上对该端点有效。然而,当我在localhost:8080/秒上执行HTTP GET时,我无法取回正文

要做到这一点,您需要使用该路径对条目进行递归搜索,大致如下(请参见注释):

const repAll={
文件1:{
路径:“/first”
},
子目录:{
文件2:{
路径:“/秒”
},
子目录:{
文件3:{
路径:“/第三”
}
}
} 
};
const req={};
函数findEntry(数据、路径){
for(对象的常量值。值(数据)){
//这是叶节点还是容器?
if(value.path){
//Leaf,如果匹配就退回
如果(value.path==路径){
返回值;
}
}否则{
//容器,递归地查看其内部
const entry=findEntry(值、路径);
如果(条目){
返回条目;
}
}
}
返回undefined;//只是为了显式
}
for(常量url为[“/第一”、“第二”、“第三”、“第四”]){
req.url=url;
log(req.url+“:”,findEntry(repAll,req.url));
}
。作为控制台包装器{
最大高度:100%!重要;

}
@T.J.Crowder-当我说打印…时,我的意思是实际打印变量
reqAll
。如果我让过滤器简单地打印在那里,它只输出文件名。忽略我。我的子目录名为
x
,我在输出中忽略了它。我得到的输出与您的一样。:-)我不太明白你想用这些JSON文件做什么。
path
属性是否应该是您为HTTP服务器定义的路径?(例如,用ExjJS或膝关节炎或……),然后在处理这个请求时使用同一个对象(其中包含“代码>路径< /代码>的对象”)中的其他数据(@ T.J.Cuulder--所以,我将执行HTTP GET, LoalHoal:8080 /Frase,并且应该返回 Fiel1对象的正文。这实际上对该端点有效。然而,当我在
localhost:8080/秒
上执行HTTP GET时,我无法取回正文。这是因为
let source…
部分。它假设每个新对象都以文件名开头,并在其正下方具有
path
属性,而我们可以看到第二个对象以目录名开头,仅在其正下方具有文件名。路径属性被隐藏在对象的第二层中。太棒了!我现在还是一名大三学生,所以当人们对我说“递归”时,我对XD很着迷。但是你的代码现在让我觉得很有意义!谢谢你的帮助,TJ