Node.js 读取文件夹树并将其转换为对象
我有以下文件夹结构:Node.js 读取文件夹树并将其转换为对象,node.js,recursion,fs,Node.js,Recursion,Fs,我有以下文件夹结构: +---controllers | | index.js | | | +---api | | index.js | | test.js | | | \---routes | | index.js | | | \---partials | | index.js | | | +---bug
+---controllers
| | index.js
| |
| +---api
| | index.js
| | test.js
| |
| \---routes
| | index.js
| |
| \---partials
| | index.js
| |
| +---bugs
| +---compatibility
| +---documentation
| | amd.js
| | api.js
| | jquery.js
| | options.js
| | usage.js
| |
| \---installation
我正在尝试从树中创建一个如下所示的对象:
{
api: {
index: require("index.js"),
test: require("test.js")
},
routes: {
index: require("index.js"),
partials: {
index: require("index.js"),
bugs: {},
compatibility: {},
documentation: {
amd: require("amd.js"),
api: require("api.js"),
jquery: require("jquery.js"),
options: require("options.js"),
usage: require("usage.js")
},
installation: {}
}
}
}
我只是想不出执行此操作的逻辑,我只能通过以下代码获得树的数组:
/**
* Controllers
*/
var path = require("path"),
util = require("util"),
fs = require("fs"),
wrench = require("wrench");
var controllers = {},
tree = wrench.readdirSyncRecursive(path.resolve(__dirname, "./")).filter(function (value) {
return value !== "index.js";
});
var key,
i = tree.length - 1;
while (i >= 0) {
key = tree[i];
console.log(fs.lstatSync(path.resolve(__dirname, key)).isDirectory(), key.split(path.sep));
i--;
}
module.exports = controllers;
我真的不确定在开始循环文件夹树之后应该如何创建对象,但我认为只有当我有一些递归函数时才能这样做
编辑:
我之所以尝试这样做,是因为我试图为我的express应用程序提供某种动态路由
在我的express应用程序中,我会有如下内容:
application.get("/api/index", controllers.api.index);
application.get("/api/test", controllers.api.test);
application.get("/", controllers.routes.index);
application.get("/partials/", controllers.routes.partials.index);
application.get("/partials/documentation/amd", controllers.routes.partials.documentation.amd);
...
这些文件中的每一个都会导出类似于:
exports.index = function (request, response) {
return response.render("index");
};
这取决于文件所在的位置,可能还有更多的逻辑(以防必须加载模型)
因此,可能有一种比我现在尝试的更好的管理动态路由的方法,如果是这样的话,我愿意征求建议。我为您的案例设计了一个递归文件遍历器
var fs = require('fs');
var filetree = {};
var walkDirectory = function(path, obj) {
var dir = fs.readdirSync(path);
for (var i = 0; i < dir.length; i++) {
var name = dir[i];
var target = path + '/' + name;
var stats = fs.statSync(target);
if (stats.isFile()) {
if (name.slice(-3) === '.js') {
obj[name.slice(0, -3)] = require(target);
}
} else if (stats.isDirectory()) {
obj[name] = {};
walkDirectory(target, obj[name]);
}
}
};
walkDirectory('./controllers', filetree);
console.log(filetree);
var fs=require('fs');
var filetree={};
var walkDirectory=函数(路径,obj){
var dir=fs.readdirSync(路径);
对于(变量i=0;i
该函数将扫描目录,如果文件是脚本,则将加载该文件。如果它是一个目录,该函数将把目录引用传递给它自己,并再次执行相同的操作。我为您的情况设计了一个递归文件遍历器
var fs = require('fs');
var filetree = {};
var walkDirectory = function(path, obj) {
var dir = fs.readdirSync(path);
for (var i = 0; i < dir.length; i++) {
var name = dir[i];
var target = path + '/' + name;
var stats = fs.statSync(target);
if (stats.isFile()) {
if (name.slice(-3) === '.js') {
obj[name.slice(0, -3)] = require(target);
}
} else if (stats.isDirectory()) {
obj[name] = {};
walkDirectory(target, obj[name]);
}
}
};
walkDirectory('./controllers', filetree);
console.log(filetree);
var fs=require('fs');
var filetree={};
var walkDirectory=函数(路径,obj){
var dir=fs.readdirSync(路径);
对于(变量i=0;i
该函数将扫描目录,如果文件是脚本,则将加载该文件。如果它是一个目录,该函数将把目录引用传递给它自己,然后再做同样的事情。刚刚测试过它,它工作得很好:)再做几件事,是否可以排除根
index.js
文件?与路由
和api
处于同一级别的路由?因为将遍历的脚本将位于该索引文件中。此外,每个文件都使用exports.nameoff函数
将导出函数返回到require
。所以所有的对象都会有类似于{api:{test:{test:function(){…}}}}
的东西,我们可以将最后两个对象展平为一个,所以它最终会是这样:{api:{test:function(){…}}}
?如果你不想index.js
,那么添加name!=='index.js'
作为if(name.slice(-3)=='.js')
的条件。此外,对象应该已经像这样展开,因为函数应该分配给module.exports
,而不仅仅是exports
。刚刚测试过,效果很好:)还有一些事情,可以排除根index.js
文件吗?与路由
和api
处于同一级别的路由?因为将遍历的脚本将位于该索引文件中。此外,每个文件都使用exports.nameoff函数
将导出函数返回到require
。所以所有的对象都会有类似于{api:{test:{test:function(){…}}}}
的东西,我们可以将最后两个对象展平为一个,所以它最终会是这样:{api:{test:function(){…}}}
?如果你不想index.js
,那么添加name!=='index.js'
作为if(name.slice(-3)=='.js')
的条件。此外,对象应该已经如此展平,因为函数应该分配给module.exports
,而不仅仅是exports
。