Javascript 使用require all从目录和子目录递归加载文件
我希望与特定条件匹配的目录和子目录中有json文件,但是我不知道如何使用子目录 我正在使用查找json文件: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将输出: {
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,localhost:8080/秒
上执行HTTP GET时,我无法取回正文。这是因为let source…
部分。它假设每个新对象都以文件名开头,并在其正下方具有path
属性,而我们可以看到第二个对象以目录名开头,仅在其正下方具有文件名。路径属性被隐藏在对象的第二层中。太棒了!我现在还是一名大三学生,所以当人们对我说“递归”时,我对XD很着迷。但是你的代码现在让我觉得很有意义!谢谢你的帮助,TJ