node.js挂起所有路由
node.js挂起所有路由
- 新建一个node项目
这里我使用的是webstorm创建。启动webstorm,在file—>new—>project创建一个node项目
创建成功后可以看到这样的目录结构:
好了,这样一个node项目就创建完成了。启动项目,浏览器输入localhost:3000,界面显示就证明成功了,这里的端口号可以在bin下的www.js中进行修改。这里主要主要说的是路由的配置。
项目启动且能访问了,有些小伙伴是不是就已经迫不及待的想自己写一个方法来尝试呢?
这个时候就需要配置路由了,打开app.js可以看到
var indexRouter = require(’./routes/index’);
这个是加载routes下的index路由文件,
app.user(’/’,indexRouter );
这个就是配置路由挂起的配置了
那么现在就创建一个新的路由文件,名字叫做log.js(创建在routes目录下的),在js中添加如下代码
var express = require('express');
var router = express.Router();
router.get('/log',function (req,res,next) {
console.log('******进入自定义方法********')
});
module.exports=router;
然后去app.js中进行配置
var log = routes(’./routes/log’);同时挂起路由
app.user(’/log’,log);
重启,访问localhost:3000/log/log
发现控制台打印了:进入自定义方法**证明路由已经成功添加了,但是这个时候就会发现个问题,如果我有很多个路由,那么就要在app中添加很多个app.user();这样就有点像初学servlet一样,每次添加都要在web中配置一样,那在不适用框架的情况下证明来动态配置呢,这就是我才学的一个方法了,不适用框架来进行动态挂起所有路由;
- 在项目中创建一个新的目录
目录结构可自行定义,这是我的目录结构 - app.js同级目录下创建文件夹route.js(文件名随便起都可以的)
在route下添加如下代码:
/**
* 动态遍历目录加载路由工具
*/
var fs = require("fs");
// 动态路由
var loadRoute = {
path : './app/',
app : null,
// 遍历目录
listDir : function(dir){
var fileList = fs.readdirSync(dir.toString(),'utf-8');//遍历该级目录下的所有文件夹
console.log("当前路径:"+dir+" 下级目录所有文件名:"+fileList.toString());
for(var i=0;i<fileList.length;i++) {
var stat = fs.lstatSync(dir + fileList[i]);
// 是目录,需要继续
if (stat.isDirectory()) {
this.listDir(dir + fileList[i] + '/');
} else {
this.loadRoute(dir + fileList[i]);
}
}
},
// 加载路由
loadRoute : function(routeFile){
console.log("加载路由地址文件:"+routeFile);
var route = require(routeFile.substring(0,routeFile.lastIndexOf('.')));
// 在路由文件中定义了一个basePath变量,设置路由路径前缀
if(route.basePath){
this.app.use(route.basePath,route);
}else{
this.app.use(route);
}
},
// 初始化入口
init : function(app,path){
if(!app){
console.error("系统主参数App未设置");
return false;
}
this.app = app;
this.path = path?path:this.path;
this.listDir(this.path);
}
};
module.exports = loadRoute;
- 在app.js问价中添加应用route.js,并调用route中的初始化方法
app整体代码如下:
主要是加载var route = require(’./route’);和route.init(app,[’./app/’]);
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var route = require('./route');//自动加载路由
/*var indexRouter = require('./routes/index');
var usersRouter = require('./app/dome1/controller/logcontroller');*/
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
route.init(app,['./app/']);//启动自动加载路由初始化方法,里面的参数根据个人定义的路径不一定是我的这个
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
在app/dome1/controller/下创建一个新的路由文件logcontroller.js
里面的代码直接用前面log.js中的代码。
然后重新启动项目,访问localhost:3000发现不能直接访问了404,这是因为index.js文件不在app目录下,route问价遍历的是app目录下的所有文件,但是index不在其中,所有路由没有挂起,访问404,然后在访问localhost:3000/log
发现控制台中打印出了*******进入自定义方法********
这样一个完整的自动挂起所有路由的方法就已经完成了,其实也可以用框架来实现,但是鉴于初学,我没有直接去看公司的框架,因为也看不懂。