基于nodejs的流水线式的CRUD服务。依赖注入可以支持插件。

你猜 阅读:325 2022-04-14 11:36:29 评论:0

写代码好多年了,发现大家的思路都是写代码、写代码、写代码,还弄了个称号——码农。

我是挺无语的,我的思路是——不写代码、不写代码、不写代码!

无聊的代码为啥要重复写呢?甚至一写写好几年。

举个例子吧,要不然大家肯定很懵。

当我们刚开始学习数据库编程的时候,我们会先写一段代码,实现往一个表里添加数据的功能。这段代码是必须写的,不写怎么会?

然后熟悉这段代码,尽量知道其含义,越深入越好。

然后呢,进入项目组,发现项目里面有n张数据表,每个表都至少要有一个添加数据的功能。

那么怎么办?当然要写代码了。于是添加数据的代码被一遍又一遍的写,区别在于表名和字段名的不同,因为每个表都有自己的名称和自己的字段。

仅仅是因为表名和字段名的不同,就要一遍一遍的写类似的代码吗?这就是我说的无聊的代码。

虽然各位前辈想了很多很多的方法,比如代码生成器,这样类似的代码就不用写了,直接生成就好。但是当字段名变了怎么办?增加了一个字段怎么办?

比如orm,比如各种框架,但是总是要写代码。没发现谁把不写代码作为目标。

我在这些年里也在不断尝试,虽然有了一些效果,但是缺点还是很多,离不写代码还很远,只是做到了不写重复代码的目的。

我一直用c#来实现我的想法,但是c#太严谨了,好多思路实现起来太复杂。比如:

1、  必须先定义实体类,然后才能各种传递

2、  “插件”实现起来非常不方便。

3、  必须先编译,然后才能加载。

4、  对json不太友好,需要反复转换。

5、  反射、泛型这类的不太理想。

看了一下其他语言,发现Node非常适合我的想法,也能避免上面的那些“缺点”,只是由于种种原因,现在才开始正式学习。

Node使用的是JavaScript,天生对json非常友好,可以直接操作,不用各种转换。

可以用require加载JavaScript代码并且立即编译,可以利用这个特性方便的写插件。

require也可以加载json文件,这样依赖注入就很容易实现了。

性能方面也不用担心,毕竟阿里爸爸都在用。

  

好吧,介绍一下思路,上流程图

这是初步想法,具体细节还在不断完善。

下面是第一版代码,很初级,只是实现基本功能,因为这是我第一次写node,边熟悉node的写法和基本功能,边实现我的想法。

 话说,语言里面没有node呢,只好选择JavaScript了。

/** 
 * Created by jyk00 on 2019/3/31. 
 * 添加数据的服务 
 */ 
 
 
exports.start = function(code) { 
    console.log('开始添加数据'); 
 
    /** 根据配置信息实现添加数据的功能 
     * 获取服务信息 
     * 接收数据 
     * 验证数据 
     * 调用插件 
     * 持久化 
     * 获取持久化后数据 
     * 写数据变化日志 
     * 返回结果 
    */ 
 
    //获取服务信息 
    console.log('服务ID:' + code); 
    var meta = require('./serviceAdd_'+ code +'.json'); 
    console.log('获取服务信息:' + meta); 
 
    //获取实体类,先模拟一下 
    var data = require('./node_user.json'); 
 
    //验证数据,暂时略 
 
    //调用持久化前的插件 
 
    //持久化 
    saveData(function(err, result) { 
        console.log('#######################'); 
        console.log('saveData的回调'); 
        console.log('result:', result); 
 
    }); 
 
    //调用持久化之后的插件 
 
    //记录数据变化日志 
 
    //持久化数据 
    function saveData(callback) { 
        console.log('开始持久化'); 
        //创建mysql对象 
        var mysql  = require('mysql'); 
        var cnString = require('../sqlConnection.json'); 
        var connection = mysql.createConnection(cnString); 
 
        var sql = meta.sqlCache; 
        //拼接数据 
        var valuesParams = createParams(); 
 
        connection.connect(); 
        connection.query(sql,valuesParams,function (err, result) { 
            if(err){ 
                console.log('[INSERT ERROR ] - ',err.message); 
                callback(err, result); 
                return; 
            } 
            console.log('-------INSERT by service ----------'); 
            console.log('INSERT ID:',result.insertId); 
            console.log('#######################'); 
 
            callback(err, result); 
 
        }); 
 
        connection.end(); 
        console.log('调用结束等待结果'); 
 
    } 
 
    //拼接valuesParams 
    function createParams(){ 
        console.log('开始拼接数据数组'); 
 
        var params = []; 
        //数据变成数组的形式 
        var colName = ""; 
        for (var i=0 ;i<meta.column.length;i++) { 
            colName = meta.column[i]; 
            params.push(data[colName]); 
        } 
 
        return params; 
 
    } 
  
 
}; 

  

下面是第二版代码,功能多了一些,代码也更难看了,都是异步害的。这么丑陋的代码,肯定要进行改善的。

/** 
 * Created by jyk00 on 2019/3/31. 
 * 添加数据的服务 
 */ 
 
 
exports.start = function(code) { 
    console.log('开始添加数据'); 
 
    /** 根据配置信息实现添加数据的功能 
     * 获取服务信息 
     * 接收数据 
     * 验证数据 
     * 调用插件 
     * 持久化 
     * 获取持久化后数据 
     * 写数据变化日志 
     * 返回结果 
    */ 
 
    //获取服务信息 
    console.log('服务ID:' + code); 
    var meta = require('./serviceAdd_'+ code +'.json'); 
    console.log('获取服务信息:' + meta); 
 
    //获取实体类,先模拟一下 
    var data = require('./node_user.json'); 
 
    //验证数据,暂时略 
 
    //调用持久化前的插件 
    var plugName = meta.pluginBefore; 
    if (plugName.length === 0){ 
        //没有插件,不调用 
        console.log('没有插件,不调用'); 
        //持久化及后续 
        saveAndLast(data); 
    } 
    else 
    { 
        //有插件 
        console.log('有插件,调用'); 
        var plug = require('../plugin/' + plugName); 
        plug.begin(data,function(data){ 
            //持久化及后续 
            saveAndLast(data); 
        }); 
 
    } 
 
    //持久化以及之后的事情 
    function saveAndLast(data) { 
        //持久化 
        saveData(data,function(err, result){ 
            console.log('#######################'); 
            console.log('saveData的回调:' + data.age); 
            console.log('result:',result); 
 
            //调用持久化之后的插件 
            plugName = meta.pluginAfter; 
            if (plugName.length === 0){ 
                //没有插件,不调用 
 
                //记录数据变化日志 
            } 
            else{ 
                //有插件 
                plug = require('../plugin/' + plugName); 
                plug.begin(err, result,data,function() { 
 
                    //记录数据变化日志 
                }); 
            } 
 
        }); 
 
 
    } 
 
    //持久化数据 
    function saveData(data,callback) { 
        console.log('开始持久化'); 
        console.log('saveData的age:' + data.age); 
        //创建mysql对象 
        var mysql  = require('mysql'); 
        var cnString = require('../sqlConnection.json'); 
        var connection = mysql.createConnection(cnString); 
 
        var sql = meta.sqlCache; 
        console.log('sql:' + sql); 
        //拼接数据 
        var valuesParams = createParams(data); 
 
        connection.connect(); 
        connection.query(sql,valuesParams,function (err, result) { 
            if(err){ 
                console.log('[INSERT ERROR ] - ',err.message); 
                callback(err, result); 
                return; 
            } 
            console.log('-------INSERT by service ----------'); 
            console.log('INSERT ID:',result.insertId); 
            console.log('#######################'); 
 
            callback(err, result); 
 
        }); 
 
        connection.end(); 
        console.log('调用结束等待结果'); 
 
    } 
 
    //拼接valuesParams 
    function createParams(data){ 
        console.log('开始拼接数据数组'); 
        console.log('createParams的age:' + data.name); 
        var valuesParams = []; 
        //数据变成数组的形式 
        var colName = ""; 
        for (var i=0 ;i<meta.column.length;i++) { 
            colName = meta.column[i]; 
            valuesParams.push(data[colName]); 
        } 
 
        return valuesParams; 
 
    } 
  
 
}; 

  

今天先到这里,代码在不断改进中。以上代码都是可以正常运行的。

第二版的代码,有很多缺点,比如层次不分明,思路混乱,没法扩展。因为这还只是单表的添加,那么主从表的添加呢,批量添加又怎么办?还是要不断的改进的。 


标签:NodeJs
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号