自动注册路由

10 篇文章 0 订阅
3 篇文章 0 订阅
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));
        }
    });
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值