基於nodejs的流水線式的CRUD服務。依賴注入可以支持插件。


寫代碼好多年了,發現大家的思路都是寫代碼、寫代碼、寫代碼,還弄了個稱號——碼農。

我是挺無語的,我的思路是——不寫代碼、不寫代碼、不寫代碼!

無聊的代碼為啥要重復寫呢?甚至一寫寫好幾年。

 

舉個例子吧,要不然大家肯定很懵。

 

當我們剛開始學習數據庫編程的時候,我們會先寫一段代碼,實現往一個表里添加數據的功能。這段代碼是必須寫的,不寫怎么會?

然后熟悉這段代碼,盡量知道其含義,越深入越好。

然后呢,進入項目組,發現項目里面有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;

    }
 

};

  

今天先到這里,代碼在不斷改進中。以上代碼都是可以正常運行的。

第二版的代碼,有很多缺點,比如層次不分明,思路混亂,沒法擴展。因為這還只是單表的添加,那么主從表的添加呢,批量添加又怎么辦?還是要不斷的改進的。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM