1. 程式人生 > >關於nodejs訪問mysql的思考

關於nodejs訪問mysql的思考

對象 安裝包 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的思考