關於nodejs訪問mysql的思考
阿新 • • 發佈:2018-04-04
對象 安裝包 index connect error mysql數據庫 all 傳遞 同步
nodejs要訪問mysql數據庫,首先必須要安裝包mysql,命令:npm install mysql。安裝成功後的訪問數據庫代碼如下:
var mysql = require(‘mysql‘); var options = { host: ‘172.23.88.107‘, port: 3306, database: ‘test‘, user: ‘root‘, password: ‘zdsoft‘ }; var pool = mysql.createPool(options); pool.getConnection(function (err, conn) {if (err) { console.log(err);//打印錯誤消息 } else { conn.query("select * from student", null, function (err, results, fields) { //釋放連接 conn.release(); if (err) { console.log(err); } else { console.log(results);//成功,打印結果集 } }) } });
ok,上面的代碼經過測試是沒有任何問題的,但是現在就有個問題了,我們每次訪問數據庫都寫這麽大一篇感覺太累了,於是我們想把公共的部分提取出來創建一個類,文件名為:sqlHelper.js。由於數據庫訪問是異步訪問的,因此我們不能直接通過返回return的方式,因此就必須要使用回調函數,sqlHelper.js的代碼如下:
var mysql = require(‘mysql‘); var options = { host: ‘172.23.88.107‘, port: 3306, database:‘test‘, user: ‘root‘, password: ‘zdsoft‘ }; var pool = mysql.createPool(options); exports.query = function (sql, vals, fn) { pool.getConnection(function (err, conn) { if (err) { fn(new Error(err)); } else { conn.query(sql, null, function (err, results, fields) { //釋放連接 conn.release(); if (err) { fn(new Error(err)); } else { fn(null, results, fields); } }) } }); }
這樣,我們在調用的時候直接傳入fn這個回調函數即可,調用方法如下:
var mysql = require(‘./lib/sqlHelper.js‘);//sqlHelper.js文件在lib文件夾下面 var result = mysql.query("select * from student", null, function (err, results, fields) { if (results) { for (let index = 0; index < results.length; index++) { console.log(results[index].name); } } else { console.log("err,msg:" + err); } });
自此,我們也算是大功告成了。
================================================分割線===========================================================
然而,我們還有另外一種實現方式,就是通過Promise這個對象,通過Promise對象我們可以像編寫同步程序一樣去編寫異步代碼,從而不用去無限次的嵌套回調函數,sqlHelper.js修改如下:
var mysql = require(‘mysql‘); var options = { host: ‘172.23.88.107‘, port: 3306, database: ‘test‘, user: ‘root‘, password: ‘zdsoft‘ }; var pool = mysql.createPool(options); exports.query = function (sql) { return new Promise(function (resolve, reject) { pool.getConnection(function (err, conn) { if (err) { reject(err);//讓狀態變為已失效,並把錯誤消息傳遞回去 } else { conn.query(sql, null, function (err, results, fields) { //釋放連接 conn.release(); if (err) { reject(err); } else { resolve(results, fields);//讓狀態變為已成功,並把成功數據傳遞回去 } }) } }); }); }
調用方法修改如下:
var mysql = require(‘./lib/sqlHelper.js‘);//sqlHelper.js文件在lib文件夾下面 var promise = mysql.query("select * from student"); promise.then(function (results, fields) { for (let index = 0; index < results.length; index++) { console.log(results[index].name); } }, function (err) { console.log(err); });
可以看到,我們已經沒有使用回調函數了。
關於nodejs訪問mysql的思考