正常的路由构建可能是通过如下的方式
const express = require('express')
const app = express()
app.get('/add', function (req, res) {
//添加处理
res.send("ok")
})
app.listen(3000, () => {
console.log('服务启动')
})
或者在另一个文件定义对应路径的请求方式及路径的对应处理方法。会显得繁琐
下面我们通过定义一个文件来表明,路径与文件对应的处理关系,来灵活的绑定
/**
* Notes: 路由配置文件
* @分割当前处理改地址的文件与处理方法
* #分割 当前处理方法执行的验证方法
*/
module.exports = {
'/test/one': 'controller@getAll', //获取全局配置(所有)
'/test/two': 'controller@userData#noDemo',
}
主文件
const application = require('./application.js');
const express = require('express') //引入express 模块
const bodyParser=require('body-parser'); //用于post请求格式化请求体,要不是个null
const app = express(); //创建实例
app.use(bodyParser());
app.use('/mytest', (req,res)=>{
console.log(req.body);
console.log(req.headers);
console.log(req.ip);
console.log(req.method);
console.log(req.path);
//这里可以吧相应的数据传入
var result=application.app(req);
res.send(req.body);
});
app.listen(3000,()=>{
console.log('服务器在3000端口开启。。。。。');
})
核心处理文件 application.js
/**
* Notes: 业务主逻辑
*/
//引用一些必要的处理工具类
const util = require('../utils/util.js');
const timeUtil = require('../utils/time_util.js');
const appUtil = require('./app_util.js');
//对应的请求返回码
const appCode = require('./app_code.js');
//获取一些配置信息
const config = require('../../config/config.js');
//获取路由对照关系表
const routes = require('../../config/route.js');
function app(req) {
let r = '';
try {
//检查是否包含路由
if (!util.isDefined(req.path)) {
showEvent(req);
console.error('Route Not Defined');
return appUtil.handlerSvrErr();
}
//进行路由转换
r = req.path.toLowerCase();
if (!r.includes('/')) {
showEvent(req);
console.error('Route Format error[' + r + ']');
return appUtil.handlerSvrErr();
}
// 路由不存在
if (!util.isDefined(routes[r])) {
showEvent(req);
console.error('Route [' + r + '] Is Not Exist');
return appUtil.handlerSvrErr();
}
let routesArr = routes[r].split('@');
let controllerName = routesArr[0];
let actionName = routesArr[1];
// 事前处理
if (actionName.includes('#')) {
let actionNameArr = actionName.split('#');
actionName = actionNameArr[0];
if (actionNameArr[1] && config.IS_DEMO) {
console.log('###演示版事前处理, APP Before = ' + actionNameArr[1]);
return beforeApp(actionNameArr[1]);
}
}
console.log('');
console.log('');
let time = timeUtil.time('Y-M-D h:m:s');
let timeTicks = timeUtil.time();
// 引入逻辑controller
controllerName = controllerName.toLowerCase().trim();
const ControllerClass = require('../../project/controller/' + controllerName + '.js');
const controller = new ControllerClass(r, req);
// 调用方法
//await controller['initSetup']();
let result = controller[actionName]();
// 返回值处理
if (isOther) {
// 非标处理
return result;
} else {
if (!result)
result = appUtil.handlerSucc(r); // 无数据返回
else
result = appUtil.handlerData(result, r); // 有数据返回
}
console.log('------');
time = timeUtil.time('Y-M-D h:m:s');
timeTicks = timeUtil.time() - timeTicks;
console.log(`【${time}】【Return Base↗↗↗】\n【↗Route =***${r}】\n【↗Duration = ${timeTicks}ms】\n【↗↗OUT DATA】= `, result);
console.log('▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦');
console.log('');
console.log('');
return result;
} catch (ex) {
console.log('------');
time = timeUtil.time('Y-M-D h:m:s');
console.error(`【${time}】【Return Base↗↗↗】\n【↗Route = ${r}】\Exception MSG = ${ex.message}, CODE=${ex.code}`);
// 系统级错误定位调试
if (config.TEST_MODE && ex.name != 'AppError') return appUtil.handlerSvrErr();;
console.log('▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦▦');
console.log('');
console.log('');
if (ex.name == 'AppError') {
// 自定义error处理
return appUtil.handlerAppErr(ex.message, ex.code);
} else {
//console.log(ex);
// 系统error
return appUtil.handlerSvrErr(ex.message, ex.code);
}
}
}
// 事前处理
function beforeApp(method) {
switch (method) {
case 'noDemo': {
return appUtil.handlerAppErr('本系统仅为客户体验演示,后台提交的操作均不生效!', appCode.LOGIC);
}
}
console.error('事前处理, Method Not Find = ' + method);
}
// 展示当前输入数据
function showEvent(req) {
console.log(req);
}
module.exports = {
app
}