NodeJS+Mysql2快速實現數據庫的增刪改查功能,手把手教你使用Promise對象轉換回調函數

基於Node+MySQL實現CURD功能

作 者:Taylor

B站ID:Rong姐姐很可愛

時 間:2019年9月14日 下午17:30

1.場景

​ 在使用node進行日常開發學習中,難免會進行數據庫相關的增刪改查功能,對於初學者而言,常見的數據庫便是Mysql數據庫,因此以下便是詳細述說如何用Mysql2模塊,在node語言的基礎上完成CURD功能;

2.CRUD功能

​ 在開發中幾乎每天都要接觸到數據庫的CURD功能,所謂的CURD功能,即:C(create:數據創建)、U(update:數據更新)、R(read:數據讀取)、D(delete:數據刪除)四種功能,當然進階還有所謂的多種查詢、批量添加、批量數據更新等功能;

3.實現流程

  • ​ 數據庫連接配置

    // 不論是jdbc連接數據庫,開始mysql2模塊來連接數據庫,都需要知道數據庫的基本用戶信息
    const dbconfig={
        // 主機IP地址
        host:'127.0.0.1',
        port:3306,
        database:'test',
        user:'root',
        password:'123456',
        //以上爲必須配置,還可以加一些額外的配置
        waitForConnections:true,
        // 數據庫連接限制
        connectionLimit:10
    }
    
  • 引入mysql2=模塊

    // 也可以直接用mysql模塊,只是myql2模塊比較新
    const mysql=require('mysql2');
    
  • 創建連接

    const connection=mysql.createConnection({
            // 主機IP地址
        host:'127.0.0.1',
        port:3306,
        database:'test',
        user:'root',
        password:'123456',
        //以上爲必須配置,還可以加一些額外的配置
        waitForConnections:true,
        // 數據庫連接限制
        connectionLimit:10
    })
    // 使用connection前,一定要打開連接
    connection.connect();
    // 使用connection後,一定要及時關閉連接;
    connection.end();
    
  • 數據庫操作

    // 創建連接
    const connection=mysql.createConnection(dbconfig);
    // 開連接,
    connection.connect();
    // 定義sql,這裏可以根據sql來具體區分執行什麼操作
    const sql='insert into table (..,..,..,) values (?,?,?)';
    // 執行quer語句
    connnection.query(sql,[參數數組],(err,result)=>{
        if(err){
            // 操作失敗
        }
        // 操作成功,result爲結果
        // 因爲是回調方法,所以需要在回調方法執行完,在關閉
        connection.end();
    });
    // 當然關於connection連接的關閉,也可以採用then語句
    connnection.query(sql,[參數數組],(err,result)=>{
        if(err){
            // 操作失敗
        }
        // 操作成功,result爲結果
    }).then((connection)=>{
        // 這裏是等前面順利執行完,在來執行
        connection.end();
    });
    

4.CRUD封裝

​ 通過前面數據庫操作,可以很明顯的體會到,可以根據定義sql語句的不用,具體來實現數據的增刪改查甚至誰是批量查詢、插入等高階操作;

/**
* 定義方法來封裝
* sql:需要操作的sql語句,自定義
* connection: 通過mysql2模塊創建數據庫連接
* params:執行sql語句需要使用到的參數,以數組的形式
*/
function dbUtils(sql,params,connection){
    // 開連接
    connection.connect();
    // 具體調用,執行sql
    connection.query(sql,params,(err,result)=>{
        if(err){
            // 操作失敗
        }
       	// 操作成功,可在執行完操作成功後的操作後,在關閉連接
        ....
        connection.end();
    });
}
// 使用的時候,直接調用就可以了;

5.CRUD進一步封裝

​ 可以看到上面的封裝其實效果並不好,因爲quer()方法執行的時候,是通過回調的方式,如果說需要在外部通過使用query()的返回值,根據返回值進一步操作的話,就明顯的感覺上面的封裝帶來的弊端,因此可以用Promise對象來解決回調方法返回值的問題;

/**
* 進一步來封裝
* sql:需要操作的sql語句,自定義
* connection: 通過mysql2模塊創建數據庫連接
* params:執行sql語句需要使用到的參數,以數組的形式
*/
function dbUtils(sql,params,connection){
	const tempResult =	new Promise((resolve,reject)=>{
        // 開連接
    	connection.connect();
        // 執行sql
        connection.query(sql,params,(err,result)=>{
            // 利用resolve、reject來處理result和err,向外拋,且二者自帶return功能
            if(err){
                reject(err);
            }
            // 成功
            resolve(result);
        })
    });
    // 關閉連接
    connection.end();
    // 返回結果
   	return tempResult;
}
// 使用的時候,如果是reject(err)往外跑異常,則需要捕獲
try{
    const result=dbUtils(sql,params,connection);
    if(result!==undefined){
        // 執行成功,進行其他操作
    }
}catch(err){
    // 出錯
}
// 就這樣異步執行的回調函數就可以利用Promise對象轉換爲同步執行

6.進一步瞭解Priomise對象

​ Promise對象提供兩個常見的resolve()、reject()方法 ;可以reject()方法來處理異常,向外拋出,用resolve()來處理正常操作對應的結果,當然,Promise()對象也提供了原型鏈的操作,用then()來處理獲取resolve()方法返回的值,用catch()來捕獲reject()方法拋出來的異常;

// 例如,定義一個Promise對象
let pormise=new Promise((resovle,reject)=>{
    resovle(43);
});
promise.then(value=>{
    console.log(value);  //輸出43
});
let promiseReject=new Promise((reject)=>{
    reject(44);
})
promiseReject.then(value=>{
    console.log(value); // 輸出undefined
});
promiseReject.catch(err=>{
    console.log(err); // 輸出44
})
// 當然,Promise也支持鏈式寫法
new Promise((resolve,reject)=>{
   	const result= function(value){
        // 假設value有值
        if(value%2===0){
            resovle(1)
        }
        reject(0)
    }
}).then(resolveValue=>{
    // 獲取resolve向外拋出來的數值;
    console.log(resolveValue);// 輸出1
}).catch(rejectValue=>{
    // 捕獲reject拋出的數值;
   console.log(rejectValue);// 輸出0
});

Promise對象參考連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章