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

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

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

無聊的代碼爲啥要重複寫呢?甚至一寫寫好幾年。node

 

舉個例子吧,要否則你們確定很懵。mysql

 

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

而後熟悉這段代碼,儘可能知道其含義,越深刻越好。數據庫

而後呢,進入項目組,發現項目裏面有n張數據表,每一個表都至少要有一個添加數據的功能。編程

那麼怎麼辦?固然要寫代碼了。因而添加數據的代碼被一遍又一遍的寫,區別在於表名和字段名的不一樣,由於每一個表都有本身的名稱和本身的字段。json

 

僅僅是由於表名和字段名的不一樣,就要一遍一遍的寫相似的代碼嗎?這就是我說的無聊的代碼。c#

 

雖然各位前輩想了不少不少的方法,好比代碼生成器,這樣相似的代碼就不用寫了,直接生成就好。可是當字段名變了怎麼辦?增長了一個字段怎麼辦?數組

 

好比orm,好比各類框架,可是老是要寫代碼。沒發現誰把不寫代碼做爲目標。

 

我在這些年裏也在不斷嘗試,雖然有了一些效果,可是缺點仍是不少,離不寫代碼還很遠,只是作到了不寫重複代碼的目的。

 

我一直用c#來實現個人想法,可是c#太嚴謹了,好多思路實現起來太複雜。好比:

一、  必須先定義實體類,而後才能各類傳遞

二、  「插件」實現起來很是不方便。

三、  必須先編譯,而後才能加載。

四、  對json不太友好,須要反覆轉換。

五、  反射、泛型這類的不太理想。

 

 

看了一下其餘語言,發現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;

    }
 

};

  

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

第二版的代碼,有不少缺點,好比層次不分明,思路混亂,無法擴展。由於這還只是單表的添加,那麼主從表的添加呢,批量添加又怎麼辦?仍是要不斷的改進的。 

相關文章
相關標籤/搜索