node連接mysql查詢事務處理的實現(xiàn)
自己用 mysql 很多次的,然后又是主玩nodejs的.專門寫一篇文章來說說nodejs連接mysql數(shù)據(jù)庫。在使用之前,請檢查計算機是否具有一下環(huán)境!
- nodejs 執(zhí)行環(huán)境。
- mysql數(shù)據(jù)庫環(huán)境(下載地址)。
- navicat 連接 mysql 數(shù)據(jù)庫的圖形化操作軟件。(非必要)

進入正題 mysql 增刪改查
首先,我們?nèi)ハ螺d一個叫mysql的依賴包,這個包就是通過 nodejs 代碼去連接數(shù)據(jù)庫,從而操作數(shù)據(jù)庫。
創(chuàng)建一個文件夾,快速生成pakeage.json文件
D:\nodejs_mysql>npm init -y # 快速傳創(chuàng)建包管理文件
安裝依賴
D:\nodejs_mysql>npm i mysql -D # 安裝mysql 依賴包
創(chuàng)建一個 index.js 文件,代碼如下
const mysql = require("mysql");
// 創(chuàng)建 一個mysql 連接池
const pool = mysql.createPool({
host: "127.0.0.1", // 連接數(shù)據(jù)庫的地址 127.0.0.1 為本地的mysql
user: "root", // 連接數(shù)據(jù)庫的用戶名 root 是最高權(quán)限
password: "", // 連接數(shù)據(jù)庫的密碼
database: "apm", // 操作的數(shù)據(jù)庫名
port: "3306", // 連接mysql的端口號
multipleStatements: true, // 運行一次執(zhí)行多條sql語句 可以忽略此項
});
function select() {
// 請求連接mysql
pool.getConnection((err, connection) => {
// 未連接成功 報錯
if (err) throw err;
// 得到一個 連接對象 調(diào)用 query 方法 可以執(zhí)行 sql 語句
let sql = "select * from goods";
// 運行sql語句 query 第二個參數(shù)為 sql語句需要的參數(shù) ,沒有可以不寫
connection.query(sql, (errors, results, fields) => {
// 釋放連接
connection.release();
// 如果運行sql語句有報錯 拋出錯誤
if (errors) throw errors;
console.log(results);
console.log(fields);
});
});
}
select();
以上的代碼是查詢 數(shù)據(jù)庫apm一個數(shù)據(jù)表goods的數(shù)據(jù)。results為從數(shù)據(jù)庫取出的數(shù)據(jù)。
封裝方法 使用Promise來查詢數(shù)據(jù)庫
// index.js
// ... 忽略前面的創(chuàng)建mysql連接池代碼
function query(sql, params) {
return new Promise((resolve, reject) => {
pool.getConnection((err, connection) => {
// 未連接成功 報錯
if (err) return reject(err);
// 得到一個 連接對象 調(diào)用 query 方法 可以執(zhí)行 sql 語句
// 運行sql語句 query 第二個參數(shù)為 sql語句需要的參數(shù) ,沒有可以不寫
connection.query(sql, params, (errors, results, fields) => {
// 釋放連接
connection.release();
// 如果運行sql語句有報錯 拋出錯誤
if (errors) return reject(errors);
resolve(results);
});
});
});
}
query("select * from goods", null).then((result) => {
console.log(result);
});
module.exports = {
query,
};
使用
// data.js
const index = require("./index.js");
var sql = "select * from goods";
index
.query(sql, null)
.then((result) => {
// do anything ....
})
.catch((err) => {
// error
console.log(err);
});
這樣就向外暴露了一個數(shù)據(jù)庫運行 sql 的接口。通過promise使用.then這種鏈式調(diào)用的代碼風格。
mysql 事務處理
說到 mysql 事務,我也就不做過多介紹了,這里給個友情鏈接方便大家學習。MySQL 事務處理
我們直接步入正題,使用promise來封裝 mysql 的事務處理.
// index.js
// .... 部分創(chuàng)建 pool 的代碼
/**
* mysql 事務處理
* @param {Array} sqls 需要執(zhí)行的sql語句
* @param {Array} params 對應上面sql語句的參數(shù)
* @returns {Promise} 返回一個Promise
*/
function transaction(sqls, params) {
return new Promise((resolve, reject) => {
pool.getConnection(function (err, connection) {
// 連接失敗 promise直接返回失敗
if (err) {
return reject(err);
}
// 如果 語句和參數(shù)數(shù)量不匹配 promise直接返回失敗
if (sqls.length !== params.length) {
connection.release(); // 釋放掉
return reject(new Error("語句與傳值不匹配"));
}
// 開始執(zhí)行事務
connection.beginTransaction((beginErr) => {
// 創(chuàng)建事務失敗
if (beginErr) {
connection.release();
return reject(beginErr);
}
console.log("開始執(zhí)行事務,共執(zhí)行" + sqls.length + "條語句");
// 返回一個promise 數(shù)組
let funcAry = sqls.map((sql, index) => {
return new Promise((sqlResolve, sqlReject) => {
const data = params[index];
connection.query(sql, data, (sqlErr, result) => {
if (sqlErr) {
return sqlResolve(sqlErr);
}
sqlReject(result);
});
});
});
// 使用all 方法 對里面的每個promise執(zhí)行的狀態(tài) 檢查
Promise.all(funcAry)
.then((arrResult) => {
// 若每個sql語句都執(zhí)行成功了 才會走到這里 在這里需要提交事務,前面的sql執(zhí)行才會生效
// 提交事務
connection.commit(function (commitErr, info) {
if (commitErr) {
// 提交事務失敗了
console.log("提交事務失敗:" + commitErr);
// 事務回滾,之前運行的sql語句不生效
connection.rollback(function (err) {
if (err) console.log("回滾失敗:" + err);
connection.release();
});
// 返回promise失敗狀態(tài)
return reject(commitErr);
}
connection.release();
// 事務成功 返回 每個sql運行的結(jié)果 是個數(shù)組結(jié)構(gòu)
resolve(arrResult);
});
})
.catch((error) => {
// 多條sql語句執(zhí)行中 其中有一條報錯 直接回滾
connection.rollback(function () {
console.log("sql運行失?。?" + error);
connection.release();
reject(error);
});
});
});
});
});
}
module.exports = {
transaction,
};
之后只需要調(diào)用這個方法就可以執(zhí)行 mysql 事務了
// data.js
const index = require("./index.js");
var sqls = [
"delete from goods where goods_id = ?", // 刪除 語句
"update goods set num = ? where goods_id = ?;", // 更新語句
];
var params = [
[1], // parmas 是數(shù)組格式 與sqls里的sql語句里 ? 一一對應
[5, 3],
];
index
.transaction(sqls, params)
.then((arrResult) => {
// do anything ....
})
.catch((err) => {
// error
console.log(err);
});
到此這篇關(guān)于node連接mysql查詢事務處理的實現(xiàn)的文章就介紹到這了,更多相關(guān)node連接mysql查詢事務處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js文件的復制、創(chuàng)建文件夾等相關(guān)操作
這篇文章主要給大家介紹了node.js文件的復制、創(chuàng)建文件夾等相關(guān)操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
node.js在Linux下執(zhí)行shell命令、.sh腳本的問題
很多時候需要多個命令來完成一項工作,而這個工作又常常是重復的,這個時候我們自然會想到將這些命令寫成sh腳本,下次執(zhí)行下這個腳本一切就都搞定了,下面就是發(fā)布代碼的一個腳本示例2022-01-01
Node.js 使用axios讀寫influxDB的方法示例
這篇文章主要介紹了Node.js 使用axios讀寫influxDB的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Linux CentOS系統(tǒng)下安裝node.js與express的方法
這篇文章主要給大家介紹了在Linux CentOS系統(tǒng)下安裝node.js與express的方法,文中介紹的非常詳細,相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-04-04
node.js中fs文件系統(tǒng)目錄操作與文件信息操作
本篇文章給大家詳細分析了node.js中fs文件系統(tǒng)目錄操作與文件信息操作的方法以及代碼詳解,需要的讀者可以參考下。2018-02-02
Node.js如何響應Ajax的POST請求并且保存為JSON文件詳解
這篇文章主要介紹了關(guān)于Node.js是如何響應Ajax的POST請求并且保存為JSON文件的相關(guān)資料,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03

