之前有用过 mysql 的模块,但是感觉并不太好用。至少语义替换这块并没有很好的解决办法, 看到mysql2有这个功能,果断就替换。使用下列命令就可以很轻松安装。
npm install mysql2 --save
首先自己建一个新文件名字为 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;
};
仅仅使用它自带的函数还有一点不够,需要阅读它的源码并自己写函数才能满足开发需求,例如返回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;
};