
本文主要介紹開源node.js庫mysql-queries,其可以同時執行多條SQLs,且只有一個回調。同時拋磚引玉,與大家交流node.js開發經驗。
node.js很大的特點就是事件驅動、非阻塞和異步執行,很多地方都需要回調處理。在一些復雜業務中,會出現由於回調處理引起的代碼多層嵌套,其可讀性和感觀,對一些開發者來說,顯得不適應,甚至惡心。 從而引起口水戰, 甚至於否定node.js。多層嵌套的代碼組織方式,顯然是不可取的, 但並不是說事件驅動、非阻塞、異步執行和回調處理等不好,這些恰恰是編程的核心思想,在編碼上對開發者有一定的要求和約束,需要對業務開發進行分析解耦,從而更好的組織代碼讓其看起來更加簡練。所以,觀念上需要改變和適應。言歸正傳,下面聊一聊mysql-queries。
顧名思義,mysql-queries就是為mysql簡單地執行多條SQLs的node.js庫。其特點在於無需多層嵌套,且只有一個回調,從而使代碼更加簡潔。下面通過實例演示一下,比較傳統的方式和mysql-queries在編碼上的差異。
實例
例如同時執行下面三條SQLs:
var sqls = ['SELECT * FROM prod_unit WHERE NAME=? limit 1',
'INSERT INTO prod_unit(name) values(?)',
'INSERT INTO product(name, unit_id, price) VALUES(?, ?, ?)'];
- 傳統的做法
var mysql = require('mysql'),
conf = {
host: 'localhost',
user: 'nodejs',
password: 'nodejs',
database: 'nodejs',
port: 3306
},
conn = mysql.createConnection(conf);
conn.connect();
conn.query(sqls[0], [params.unit_name], function (err0, res0) {
if (err0) {
console.log(err0);
} else {
conn.query(sqls[1], [params.unit_name], function (err1, res1) {
if (err1) {
console.log(err1);
} else {
conn.query(sqls[2], [params.name,params.type_id,params.unit_id,params.price], function (err2, res2) {
if (err2) {
console.log(err2);
} else {
//TODO something
}
});
}
});
}
});
- 使用mysql-queries
//實際使用中可以在應用啟動時進行初始化(只需執行一次)
require('mysql-queries').init(conf);
//執行多條SQLs
var mq = require('mysql-queries');
mq.queries(sqls,
[[params.unit_name],[params.unit_name],[params.name,params.type_id,params.unit_id,params.price]], function(err, results){
if(err) {
console.log(err);
} else {
//"results"為數組,其為多條SQL的執行結果.
console.log(results);
}
});
進階用法--根據前面SQL的執行結果,判斷是否執行當前SQL
例如上述SQLs,在新增商品時允許自定義單位,如果單位不存在,新建商品單位。否則,直接新增商品。
mq.queries(sqls,
[[params.unit_name],[params.unit_name],[params.name,params.type_id,params.unit_id,params.price]], {
skip:function(i, arg, results) {//skip判斷是否忽略當前SQL的執行,返回true忽略,false不忽略
var skip = false;
//i為SQLs的索引號
switch(i) {
case 1:
//根據第1條SQL的結果,判斷是否忽略執行第2條SQL
skip = results[0].length!==0;
break;
case 2:
//如果第二條被執行,其結果中的"insertId"將作為第3條SQL的參數
if(results[0].length===0) {
arg[2]=results[1].insertId;
}
break;
}
return skip;
}
}, function(err, results){
if(err) {
console.log(err);
} else {
//"results"為數組,其為多條SQL的執行結果.
console.log(results);
}
});
另外
mysql-queries除了上述對代碼的簡化外, 其還采用了數據源和事務處理, 從而提高了開發效率和實用性,給數據庫操作帶來了很大的便利。
最后
本文除了介紹mysql-queries, 希望可以拋磚引玉, 從另一個角度看待node.js開發. 通過類似的方式對異步操作進行處理, 實現例如oracle-queries, ajax-queries等等, 也即此跟大家交流node.js開發心得.
更多內容,源碼和加星訪問:
https://github.com/zzzhan/nodejs-mysql-queries
