node+express框架中連線使用mysql經驗總結

_南風發表於2018-11-08

最近在學習node.js,做了一個練手專案,使用node.js+express框架,配合mysql資料庫和前端vue框架開發一個多人文件編輯系統。

node.js環境下express+mysql的服務端專案示例


首先是環境搭建:

node環境下

$ npm install -g express-generator
$ express -e project
複製程式碼

進入專案檔案根目錄安裝依賴模組

$ npm install
$ DEBUG=node-blog:* npm start
複製程式碼

看看專案目錄都有什麼

node+express框架中連線使用mysql經驗總結

看看生成的工程目錄裡面都有什麼,

bin:存放可執行檔案

node_modules:存放 package.json 中安裝的模組,當你在 package.json 新增依賴的模組並安裝後,存放在這個資料夾下

public:存放 image、css、js 等前端資原始檔

routes:存放路由檔案

views:存放檢視檔案或者說模版檔案

app.js:啟動檔案,或者說入口檔案

package.json:儲存著工程的資訊及模組依賴,當在 dependencies 中新增依賴的模組時,執行npm install ,npm 會檢查當前目錄下的

package.json,並自動安裝所有指定的模組

下面開始安裝資料庫,這裡我選擇的是mysql。

npm install mysql --save-dev
複製程式碼

安裝完畢之後,開始配置資料庫。

//mysql配置檔案
mysql = {

        host: "xx.xxx.xx.xxx", //這是資料庫的地址

        user: "xxx", //需要使用者的名字

        password: "xxx", //使用者密碼 ,如果你沒有密碼,直接雙引號就是

        database: "xxx" //資料庫名字

    } //好了,這樣我們就能連線資料庫了
    
    module.exports = mysql; //用module.exports暴露出這個介面,
複製程式碼

mysql連線池配置:

//mysql連線池配置檔案
var mysql = require('mysql');
var $dbConfig = require('../config/mysql');//注意改成自己專案中mysql配置檔案的路徑

// 使用連線池,避免開太多的執行緒,提升效能
var pool = mysql.createPool($dbConfig);

/**
 * 對query執行的結果自定義返回JSON結果
 */
function responseDoReturn(res, result, resultJSON) {
    if (typeof result === 'undefined') {
        res.json({
            code: '201',
            msg: 'failed to do'
        });
    } else {
        res.json(result);
    }
};

/**
 * 封裝query之sql帶不佔位符func
 */
function query(sql, callback) {
    pool.getConnection(function(err, connection) {
        connection.query(sql, function(err, rows) {
            callback(err, rows);
            //釋放連結
            connection.release();
        });
    });
}

/**
 * 封裝query之sql帶佔位符func
 */
function queryArgs(sql, args, callback) {
    pool.getConnection(function(err, connection) {
        connection.query(sql, args, function(err, rows) {
            callback(err, rows);
            //釋放連結
            connection.release();
        });
    });
}

//exports
module.exports = {
    query: query,
    queryArgs: queryArgs,
    doReturn: responseDoReturn
}
複製程式碼

運算元據庫的過程比較靈活,我是使用模組化的思想,將一張資料表封裝成一個模組暴露出去,通過該模組獲取這張表的增刪改查SQL語句。下面貼上示例程式碼:

let express = require('express');
let mysql = require('../common/basicConnection');

let qibu_task = {
    index: '',
    value: '',
    list: `SELECT * from qibu_task;`, //列表查詢
    insert(args) {
        qibu_task.index = '';
        qibu_task.value = '';
        args = filter(['id', 'task', 'name', 'created_at'], args)
        for (let key in args) {
            qibu_task.index = `${qibu_task.index}${key},`
            let re = /^[0-9]+.?[0-9]*/;
            if (re.test(args[key])) {
                qibu_task.value = `${qibu_task.value}${args[key]},`
            } else {
                qibu_task.value = `${qibu_task.value}'${args[key]}',`
            }
        }
        qibu_task.index = qibu_task.index.substr(0, qibu_task.index.length - 1);
        qibu_task.value = qibu_task.value.substr(0, qibu_task.value.length - 1);

        return `INSERT INTO qibu_task (${qibu_task.index}) VALUES(${qibu_task.value})`;
    }, //按需增加
    select(index, value) {
        return `SELECT * from qibu_task where ${index}=${value};` //按需查詢
    },
    delete(index, value) {
        return `DELETE from qibu_task where ${index}=${value};` //按需刪除
    },
    update(index, args) { //提交修改
        if (index in args) {
            qibu_task.value = '';
            args = filter(['id', 'task', 'name', 'created_at'], args)
            for (let key in args) {
                let re = /^[0-9]+.?[0-9]*/;
                if (re.test(args[key])) {
                    qibu_task.value = `${qibu_task.value}${key}=${args[key]},`
                } else {
                    qibu_task.value = `${qibu_task.value}${key}='${args[key]}',`
                }
            }
            qibu_task.value = qibu_task.value.substr(0, qibu_task.value.length - 1)
            return `UPDATE qibu_task SET ${qibu_task.value} WHERE ${index}=${args[index]};`
        }
    },
};
//引數過濾
function filter(arguments, obj) {
    let newObj = {}
    arguments.forEach(every => {
        if (every in obj) {
            newObj[every] = obj[every]
        }
    });
    return newObj;
};
module.exports = qibu_task;
複製程式碼

然後就可以在路由返回時進行資料庫操作啦。具體程式碼就不貼啦。路由可以識別get、post方法,修改和刪除通過傳遞引數模擬。

更新

專案中覺得對每張資料表單獨寫增刪改查語句效率太低,所以對資料表SQL語句生成的過程進行了一些修改,通過建構函式構造出DBSQL類來生成想要的資料表的SQL語句,在路由中new一個DBSQL例項即可,具體程式碼已經上傳github。


到這裡整個服務端配置就差不多了。除此之外,專案還有socket.io的使用,就另外再說吧。下面貼上github地址,觀眾老爺們走過路過賞個start唄^.^

node.js環境下express+mysql的服務端專案示例

相關文章