NodeJS mysql2 使用心得

NodeJS mysql2 使用

一、mysql2的安装

之前有用过 mysql 的模块,但是感觉并不太好用。至少语义替换这块并没有很好的解决办法, 看到mysql2有这个功能,果断就替换。使用下列命令就可以很轻松安装。

npm install mysql2 --save

二、mysql2的使用

首先自己建一个新文件名字为 mysql_pool.js 。然后,废话不多说,直接上代码。

var mysql = require('mysql2');  
var mysql_pool = mysql.createPool({  
    host: MYSQL_HOST,  
    user: MYSQL_USER,  
    password: MYSQL_PASS,  
    database: MYSQL_DATABASE,  
    port: MYSQL_PORT 
});  
module.exports=mysql_pool;  

通过建立 mysql IP池 ,我们可以让连接循环利用,让nodejs跑得更欢快。
这样在nodejs里面就可以直接得到这个模块了。然后在其他地方直接使用这个模块。

var mysql_pool = require('../lib/mysql_pool');
function tb_reward_model(){
    this._status = {
        "SUCCESS":1,
        "FAILURE":0,
        "ISIDENTIFY":2,
        "ERROR":-1
    };
}
tb_reward_model.prototype.setnotvalid = function(re_id){
    mysql_pool.execute("UPDATE `tb_reward` SET `re_isvalid`='N' WHERE  `re_id`= ? "
        ,[re_id]
        ,function(err,rows){
            if(err){
                console.log(err);
                return that._status.ERROR;
            }
            else{
                return that._status.SUCCESS;
            }
        }
    );
};

这里附带一句,如果要根据返回值判断,还必须使用q来进行异步编程。
因为Nodejs本身是单线程模式,不同直接获取这个函数值得返回值来判断是否成功。如下:

var q   = require('q');
tb_reward_model.prototype.setnotvalid = function(re_id){
    var that = this;
    var deferred = q.defer();
    mysql_pool.execute("UPDATE `tb_reward` SET `re_isvalid`='N' WHERE  `re_id`= ? "
        ,[re_id]
        ,function(err,rows){
            if(err){
                console.log(err);
                deferred.reject(that._status.ERROR);
            }
            else{
                deferred.resolve(that._status.SUCCESS);
            }
        }
    );
    return deferred.promise;
};

三、mysql2 的进阶使用

仅仅使用它自带的函数还有一点不够,需要阅读它的源码并自己写函数才能满足开发需求,例如返回INSERT 语句插入句的自增ID,这个必须要在一个对话下完成,不然就无法通过Mysql数据库自带的函数来得到ID值。

SELECT LAST_INSERT_ID()

通过查看它的execute方法,我写出了如下函数来解决这个问题,还在刚才的mysql_pool模块中:

mysql_pool.create_and_return_id = function(sql, values, cb){
    if (typeof values === 'function') {
        cb = values;
        values = null;
    }

    this.getConnection(function (err, conn) {
        if (err) return cb(err);

        conn.execute(sql, values, function () {
            conn.execute("SELECT LAST_INSERT_ID() as id",function(){
                conn.release();
                cb.apply(this, arguments);
            });
        });
    });
};

这样子后,就可以通过原来的方法开心地调用这个函数,来获得返回值了。

tb_reward_model.prototype.create = function(user_id){
    var that = this;
    var deferred = q.defer();
    mysql_pool.create_and_return_id("INSERT INTO `tb_reward` (`user_id`) VALUES (?)"
        ,[user_id]
        ,function(err,rows){
            if(err){
                console.log(err);
                deferred.reject(that._status.ERROR);
            }
            else{
                if(rows.length > 0 ){
                    deferred.resolve(rows[0].id);
                }
                deferred.reject(that._status.FAILURE);
            }
        }
    );
    return deferred.promise;
};

你可能感兴趣的:(NodeJS)