零代碼第一步,作個添加數據的服務先。node.js + mysql

node.js + mysql 實現數據添加的功能。萬事基於服務!node

 

增刪改查之添加數據。mysql

優勢:只須要設置一個json文件,就能夠實現基本的添加功能,能夠視爲是零代碼。sql

 

添加數據的服務實現的功能:數據庫

一、  添加一條記錄、多條記錄(批量添加)、主從表記錄express

二、  記錄訪問日誌json

三、  記錄數據變化記錄數組

四、  執行步驟跟蹤和計時瀏覽器

五、  異常日誌服務器

六、  權限判斷框架

 

 

步驟:

一、  數據庫設計、建表這類的直接略過,假設有了一張表,咱們要往這個表裏面添加數據

二、  根據要添加的字段,設置一個json文件,對服務進行描述,而且給這個服務設置一個變化,做爲區分。

三、  客戶端提交數據和服務變化。

四、  服務器端,獲取數據和服務變化,調用對應的程序進行處理。

五、  處理完畢後處理返回給客戶的信息

六、  若是有特殊業務需求,能夠用插件的方式來實現。

七、  完成

 

第一步,無論用什麼方式作項目,都是要作的。

第二步須要弄一個json文件,這個能夠自動生成,不用手寫

第三步至關於作一個路由,路由規則制定好了就不用再寫代碼了。

第四步由框架完成,不須要寫代碼

第五步判斷一下是否成功,按照規則給瀏覽器返回數據,也不用一遍一遍寫。

第六步不是必須的,大部分的增刪改查都是不須要插件的。

因此,基本上作一個json文件,就能夠搞定一個服務。須要寫的代碼無限接近零代碼。而json文件又能夠自動生成。

 

下面是json文件的例子:(這個能夠自動生成)

 

{
  "operationMode":"add",
  "pluginBefore":"",
  "pluginAfter":"",
  "tableInfo":{
    "tableName": "node_user",
    "primaryKey":"id",
    "sql": "INSERT INTO node_user(id,name,age) VALUES(0,?,?)" ,
    "sqlSelect": "SELECT * FROM node_user WHERE id = ?" ,
    "column":["name","age"]

  } 

}

 

 

而後再說一下代碼類型,能夠分爲兩類——框架類和項目類

像.net框架、ado.net、express這類,內部的實現代碼都是屬於框架級的,內部有再多的代碼,也不該該算到項目裏面。

而調用類庫、使用框架實現項目的代碼,纔是項目級的代碼,纔算做代碼量。

 

這個要先說清楚,而後再發後面的代碼。

 

http的使用,屬於項目級的,http的內部實現,就是框架級的。

同理,添加服務的調用部分屬於項目級的,服務內部的實現代碼屬於框架級的。

 

先不上http了,寫一個簡單的測試用代碼,優勢是不用打開瀏覽器就能夠進行測試。要否則每次都要打開瀏覽器,太麻煩了。

這個不是正式的代碼,僅僅是初期測試用的。這個是項目級別的代碼。

/**
 * Created by jyk00 on 2019/3/31.
 * curd的服務
 */

//測試添加服務

//精確計時
var time = require('../preciseTime').time;
//建立添加服務對象
var service = require('./serviceAdd');

var trace={
    title:'收到一個請求:100',
    msg:'',
    startTime:time(),
    endTime:0,
    useTime:0,
    items:[]
};

service.start(100,trace,function (err,info) {

    msg.endTime = time();
    msg.useTime = time() - msg.startTime;

    console.log('完成服務:'+JSON.stringify(trace));

});

 

 

 

 

添加服務的代碼(業務層) 框架級代碼

/**
 * Created by jyk00 on 2019/3/31.
 * 添加數據的服務
 */


exports.start = function(code,trace,callback) {
    //精確計時
    var time = require('../preciseTime').time;

    var traceAdd = {
        title:'開始添加數據的服務',
        msg:'',
        startTime:time(),
        endTime:0,
        useTime:0,
        items:[]
    };

    trace.items.push(traceAdd);

    /** 根據配置信息實現添加數據的功能
     * 獲取服務信息
     * 接收數據
     * 驗證數據
     * 調用插件
     * 持久化
     * 獲取持久化後數據
     * 寫數據變化日誌
     * 返回結果
     */

    //獲取服務信息
    //console.log('服務ID:' + code);
    var meta = require('./service_'+ code +'.json');
    console.log('獲取服務信息:' + meta);

    //獲取實體類,先模擬一下
    var data = require('./node_user.json');

    var info={
        trace:traceAdd,
        requestId:0,
        serviceId:code,
        data:data,
        table:meta.tableInfo
    };

    //驗證數據,暫時略

    //調用持久化前的插件
    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) {
        //持久化之添加數據
        var db = require('./dataBaseAdd');

        //持久化
        db.query(info,function(err, result){
            console.log('saveData的回調:' );
            console.log('result:',result);

            //調用持久化以後的插件
            plugName = meta.pluginAfter;
            if (plugName.length === 0){
                //沒有插件,不調用

            }
            else{
                //有插件
                plug = require('../plugin/' + plugName);
                plug.begin(err, result,data,function() {


                });
            }

        });


    }



};

 

持久化的代碼(數據層) 框架級代碼

 

/**
 * Created by jyk00 on 2019/4/1.
 * 數據服務之添加操做
 
 */
//持久化內部的跟蹤
var traceStartAddData = {};
//捕捉異常
process.on('uncaughtException', function (err)  {
    console.log('uncaughtException的trace:' +JSON.stringify(traceStartAddData));
    console.log("捕捉到異常啦");
    console.log(err);

});

exports.query = function(info,callback) {
    //精確計時
    var time = require('../preciseTime').time;

    //持久化之添加數據
    traceStartAddData = {
        title:'持久化之添加數據',
        msg:'',
        startTime:time(),
        endTime:0,
        useTime:0,
        items:[]
    };

    info.trace.items.push(traceStartAddData);

    /** 根據配置信息實現添加數據的功能
     * 獲取表信息
     * 接收傳入的數據,驗證任務由上層搞定
     * 持久化
     * 獲取持久化後數據
     * 寫數據變化日誌
     * 返回結果
     */

    //==================獲取表信息和數據=================================
    var traceGetInfo = {
        title:'獲取表信息和數據、定義dataChange',
        msg:'',
        startTime:time(),
        endTime:0,
        useTime:0,
        items:[]
    };

    traceStartAddData.items.push(traceGetInfo);

    //獲取表信息
    var tableInfo = info.table;
    //獲取實體類
    var data = info.data;

    //記錄數據變化狀況
    var dataChange = {
        requestId:info.requestId,
        serviceId:info.serviceId,
        tableID:info.table.tableId,
        dataID:0,
        oldDataJson:'',
        newDataJson:'',
        submitDataJson:JSON.stringify(info.data),
        dbResult:'',
        trace:JSON.stringify(info.trace),
        addUserid:1
    };
    traceGetInfo.endTime = time();
    traceGetInfo.useTime = time() - traceGetInfo.startTime;

    //==================建立MySql對象=================================
    var traceCreateMySql = {
        title:'建立MySql對象、cnString、connection',
        msg:'',
        startTime:time(),
        endTime:0,
        useTime:0,
        items:[]
    };
    traceStartAddData.items.push(traceCreateMySql);

    //建立mysql對象
    var mysql  = require('mysql');
    var cnString = require('../sqlConnection.json');
    var connection = mysql.createConnection(cnString);

    traceCreateMySql.endTime = time();
    traceCreateMySql.useTime = time() - traceCreateMySql.startTime;

    //==================發送持久化請求=================================
    var traceAddNewData = {
        title:'準備發送持久化請求,添加一條數據',
        msg:'',
        startTime:time(),
        endTime:0,
        useTime:0,
        items:[]
    };

    traceStartAddData.items.push(traceAddNewData);

    var sql = tableInfo.sql;
    //數據轉換成數組
    var valuesParams = createParams(tableInfo,data);

    myQuery(sql,valuesParams,traceAddNewData,function (err, result) {
        //數據添加完成後的回調
        //console.log('持久化的回調的trace:' +JSON.stringify(traceStartAddData));

        if(err){
            console.log('[INSERT ERROR ] - ',err.message);
            traceAddNewData.msg += '_err:' + JSON.stringify(err);
            callback(err, result);
            return;
        }

        //記錄數據變化記錄,
        var log = require('./serviceAdd_11.json');
        //記錄添加數據後的返回信息
        dataChange.dbResult = JSON.stringify(result);
      
        //從數據庫裏獲取剛添加的數據
        var traceGetNewData = {
            title:'獲取數據庫裏添加完成的數據',
            msg:'',
            startTime:time(),
            endTime:0,
            useTime:0,
            items:[]
        };
        traceAddNewData.items.push(traceGetNewData);

        myQuery(tableInfo.sqlSelect,[result.insertId],traceGetNewData,function (err, result) {
            //獲取一條記錄完畢
            //console.log('獲取更新數據的回調result:' +JSON.stringify(result));
            //console.log('獲取更新數據的回調的trace:' +JSON.stringify(traceStartAddData));

            //記錄數據變化日誌
            var traceAddlog = {
                title:'記錄數據變化日誌',
                msg:'',
                startTime:time(),
                endTime:0,
                useTime:0,
                items:[]
            };
            traceGetNewData.items.push(traceAddlog);

            //數據庫裏的新數據
            dataChange.newDataJson = JSON.stringify(result);
            //目前爲止的跟蹤記錄
            dataChange.trace = JSON.stringify(info.trace);
            valuesParams = createParams(log.tableInfo,dataChange);

           //提交操做
            myQuery(log.tableInfo.sql,valuesParams,traceAddlog,function (err, result){
                //數據變化日誌回調完畢
                console.log('數據變化日誌回調完畢:' +JSON.stringify(info.trace));

            });

        });
        connection.end();

        //回調,不等數據變化的日誌了
        callback(err, result);

    });

    //console.log('調用結束等待結果');

    //封裝數據庫操做,以及計時器
    function myQuery(sql,vParme,traces,callback) {
        //console.log('myQuery的sql:' +sql);
        traces.msg += 'sql:'+sql;
        traces.msg += '_values:' + valuesParams;

        var conn = mysql.createConnection(cnString);
        conn.connect();
        conn.query(sql,vParme,function (err, result) {
            //console.log('myQuery的回調:' +err);

            traceStart.endTime = time();
            traceStart.useTime = time() - traceStart.startTime;

            if(err){
                console.log('[ERROR ] - ',err.message);
                traceStart.title += '——執行出錯:'+ err.message;
                traceStart.error = JSON.stringify(err)
                callback(err, result);
                return;
            }
            traceStart.title += '——成功!';

            callback(err, result);

        });
        conn.end();
        //請求發送完畢
        //console.log('請求發送完畢:');

        traces.endTime = time();
        traces.useTime = time() - traces.startTime;

        //記錄完成開始時間
        var traceStart = {
            title:'請求發送完畢,等待反饋',
            startTime:time(),
            endTime:0,
            useTime:0,
            items:[]
        };

        traces.items.push(traceStart);
    }

    //拼接valuesParams
    function createParams(colInfo,data){
        //console.log('開始拼接數據數組');
        var valuesParams = [];
        //數據變成數組的形式
        var colName = "";
        for (var i=0 ;i<colInfo.column.length;i++) {
            colName = colInfo.column[i];
            valuesParams.push(data[colName]);
        }
       
        return valuesParams;

    }

    //拼接sql
    function createSql2(){
     
        sql = 'INSERT INTO ' +meta.tableName ;

        var cols = "(" + meta.primaryKey;
        var values = " VALUES(0";
        var valuesParams = [];

        //拼接字段名和參數
        for (var key in meta.cols) {
            cols += ',' + key;
            values += ',?';
            valuesParams.push(meta.cols[key]);
        }
        sql +=cols + ')' + values + ')';
        console.log(sql);

    }

};

 

跟蹤記錄

 

{
    "title": "開始添加數據的服務",
    "msg": "",
    "startTime": 2950080457.323715,
    "endTime": 0,
    "useTime": 0,
    "items": [{
        "title": "持久化之添加數據",
        "msg": "",
        "startTime": 2950080463.596571,
        "endTime": 0,
        "useTime": 0,
        "items": [{
            "title": "獲取表信息和數據、定義dataChange",
            "msg": "",
            "startTime": 2950080463.608944,
            "endTime": 2950080463.683611,
            "useTime": 0.08490705490112305,
            "items": []
        }, {
            "title": "建立MySql對象、cnString、connection",
            "msg": "",
            "startTime": 2950080463.702811,
            "endTime": 2950080586.696783,
            "useTime": 122.99781227111816,
            "items": []
        }, {
            "title": "準備發送持久化請求,添加一條數據",
            "msg": "sql:INSERT INTO node_user(id,name,age) VALUES(0,?,?)_values:王五,45",
            "startTime": 2950080586.707023,
            "endTime": 2950080592.260519,
            "useTime": 5.556482791900635,
            "items": [{
                "title": "請求發送完畢,等待反饋——成功!",
                "startTime": 2950080592.271186,
                "endTime": 2950080612.196954,
                "useTime": 19.944968223571777,
                "items": []
            }, {
                "title": "獲取數據庫裏添加完成的數據",
                "msg": "sql:SELECT * FROM node_user WHERE id = ?_values:王五,45",
                "startTime": 2950080615.264262,
                "endTime": 2950080616.479836,
                "useTime": 1.218986988067627,
                "items": [{
                    "title": "請求發送完畢,等待反饋——成功!",
                    "startTime": 2950080616.488796,
                    "endTime": 2950080624.55792,
                    "useTime": 8.072536945343018,
                    "items": []
                }, {
                    "title": "記錄數據變化日誌",
                    "msg": "",
                    "startTime": 2950080625.123253,
                    "endTime": 0,
                    "useTime": 0,
                    "items": []
                }]
            }]
        }]
    }]
}

 

咱們在寫項目的時候,最鬱悶的就是,運行的時候報錯了,可是又不知道是哪一行出錯了。若是某個函數被調用好幾回,那麼就更頭疼了,究竟是哪一次的調用出錯了呢?

 

有了這個跟蹤就可以很方便的知道究竟是執行到了哪裏出的錯誤,便於定位和修改。

 

ps:

這幾天寫代碼的感覺就是——糟糕透了。怪不得node都這麼多年了還沒火。真的太難駕馭了。

相關文章
相關標籤/搜索