express构建另类路由

93 阅读2分钟

正常的路由构建可能是通过如下的方式

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
}