node.js/express自动注册路由
/*
* 自动注册路由
*/
var filesList = [];
var routesPath = path.join(__dirname,'routes');
getFileList(routesPath, filesList);
/*
*获取到所有文件的路径,存放在filesList数组
*最后对filesList进行遍历处理文件的路径
* */
for(var i=0; i<filesList.length; i++){
var p = filesList[i];
/*
*判断文件路径的扩展名(即文件后缀)是否为.js
*如果文件后缀为.js,且文件名为index,
*则将'/'赋予给name变量,否则将文件名赋予给name变量
* */
if(path.extname(p)=='.js'){
/*
*path.extname(path)返回path的扩展名,
*即从path的最后一个'.'到字符串结束
* */
var name = path.basename(p,'.js');
/*
*通过path模块的path.basename(path[, ext])
*返回path的最后一部分(即文件名)
*path.basename(path)返回带后缀的文件名
*path.basename(path, ext)返回不带后缀的文件名
*如path.basename('/routers/admin/login.js')
//返回login.js
* path.basename('/routers/admin/login.js', '.js)
//返回login
* */
name = (name=='index'?'/':name);
var rUrl = path.join(path.dirname(p), name);
/*
*path.dirname(path)返回path的目录名
*在将返回的目录名与不带后缀的文件名拼接为新的字符串路径
* */
rUrl = rUrl.substr( routesPath.length );
/*
*substr(startNum[, length])方法
*用于在字符串中抽取从start下标开始的指定数目字符串
*其中routersPath变量则是routers目录的路径
*即可获得不包括routers目录路径的字符串
* */
rUrl = rUrl.replace(/\\/g, "/")
/*
*replace(regexp, replacrStr)
*将replaceStr字符串替换regexp匹配到的字符串替换
* */
console.log('Add Route: '+ rUrl);
/*
*设置路由的关键
* */
app.use(rUrl, require(p));
/*
*app.use(path, function)
*如:app.use(
'/admin/login',
require('./routers/admin/login.js')
);
*等价:app.use(
'/admin/login',
require('./routers/admin/login')
);
*p变量就是存放js文件的路径
* */
}
})
//取目录及子目录所有文件
function getFileList(dstPath, filesList){
var files = fs.readdirSync(dstPath);
/*
* 通过node.js的fs模块,读取routers目录下的目录
* fs.readdirsync(path[, options])
* 返回一个 不包括'.'和'..'的文件名数组
* 再通过遍历目录名数组, */
files.forEach(function (itm, index) {
/*
*forEach(function(curVal[, index][, arr]){})
*forEach()方法用于数组的每个元素,并将元素传递给回调函数
*curVal: 必需。数组中每个元素需要调用的函数
*index: 可选。当前元素的索引值
*arr: 可选。当前元素所属的数组对象
* 再通过遍历目录名数组,
*/
var stat = fs.statSync(path.join(dstPath , itm));
/*
*fs.ststSync(path)方法用于返回一个文件的状态,
*属于fs的stats类对象
*stats.isFile() //判断是否为文件,返回类型boolean
*stats.isDirectory() //判断是否为目录,返回类型为boolean
*/
if (stat.isDirectory()) {
/*
*如果返回为目录可再获取目录下的文件
*/
getFileList(path.join(dstPath,itm), filesList);
}else{
/*
*非目录,则可将此文件的路径添加到filesList数组
*/
filesList.push(path.join(dstPath,itm));
}
});
}
在项目中运行结果如下:
使用自动生成路由的规则
routers目录下创建目录
如下图:
插入app.js自动注册路由的js代码
/*
* 自动注册路由
*/
var filesList = [];
var routesPath = path.join(__dirname,'routes');
getFileList(routesPath, filesList);
for(var i=0; i<filesList.length; i++){
var p = filesList[i];
if(path.extname(p)=='.js'){
var name = path.basename(p,'.js');
var rUrl = path.join(path.dirname(p),(name=='index'?'/':name));
rUrl = rUrl.substr( routesPath.length );
rUrl = rUrl.replace(/\\/g, "/");
console.log('Add Route: '+ rUrl);
app.use(rUrl, require(p));
}
}
//取目录及子目录所有文件
function getFileList(dstPath, filesList){
var files = fs.readdirSync(dstPath);
files.forEach(function (itm, index) {
var stat = fs.statSync(path.join(dstPath , itm));
if (stat.isDirectory()) {
getFileList(path.join(dstPath,itm), filesList);
}else{
filesList.push(path.join(dstPath,itm));
}
});
}