您的位置:首页 > 数据库 > MySQL

node.js学习(十、mysql数据存储)

2017-03-15 23:19 676 查看
在node.js中,mysql的操作需要借助mysql相关的库。在https://www.npmjs.com/搜索mysql,选择搜索结果的第一项mysql库。使用以下命令安装mysql库

npm install mysql


在项目根目录中新建一文件夹config,再新建一js文件config.js专门用来存放配置信息。如mysql端口、ip地址,账号、密码,redis的相关配置等。

查看mysql文档,发现其使用的依然是回调模式,这样不利于使用,我们对齐封装改造成同步模式。在/util文件夹中新建mysqldb.js文件,代码如下:

var mysql = require('mysql');
var async = require('async');
var myUtil = require('./util');
var config = require('../config/config');

//mysqldb:
var FILENAME = __filename.split('/').pop() + ':';

//获得连接池
var _pool = mysql.createPool( config.dbconfig );

exports.setPool = function( cfg ){
_pool = mysql.createPool( cfg );
}

//执行任意SQL
var executSQL = function ( strSql, doneCB ){

var step2 = createStep2( strSql, true );
doQuery( step2, [], doneCB );
};
exports.executSQL = executSQL;
exports.executSQL_g = myUtil.coHelper(executSQL);

//执行一系列SQL,用于批量插入操作
var serialSQL = function ( SQLs, done ){
//单条语句执行逻辑
function eachItem( item, next ){
console.log(FILENAME,'Do SQL: ', item);
exports.executSQL( item, function (err, results ){
if( err )
console.log(FILENAME, err );
else{
console.log(FILENAME, 'result:', results);
}
//完成后继续执行其他sql
next();
});
}

//所以sql执行完成回调
function allDone(){
done();
}
//异步执行所有sql 参考http://caolan.github.io/async/docs.html#eachSeries
async.eachSeries( SQLs, eachItem, allDone )
}

exports.serialSQL = serialSQL

/**
*
* @param {Object} Step2  执行函数
* @param {Object} queryParam sql参数
* @param {Object} doneCB 执行完成回调
*/
function doQuery( Step2, queryParam, doneCB ){
//数据库连接
var conn;
function step1_getConnection( next ){
//连接回调
function got( err, connection ){
//连接发生错误直接返回
if( err ) {
console.log('get connection:',err );
next( err );//发生错误,不能往下了
return;
}
//获得了连接,继续执行其他逻辑
conn = connection;
next( null, conn, queryParam )
}
//最新执行这一句,获得连接
_pool.getConnection(got);
}

//执行完成回调
function finalStep( err, result ){
if( conn )  conn.release();
//把信息传递出去
if( !err ){
for( var p in Step2 ){
result[p] = Step2[p];
}
}
doneCB( err, result );
}
//按队列执行,参考http://caolan.github.io/async/docs.html#waterfall
async.waterfall( [step1_getConnection, Step2], finalStep );
}

exports.doQuery = doQuery;
exports.doQuery_g = myUtil.coHelper(doQuery);

/**
*
* @param {Object} strSQL sql语句,带参数sql中参数用?号代替
* @param {Object} noParam 是否为带参sql
*/
function createStep2( strSQL, noParam ){
function stepFunc( conn, queryParam, next ){
function queryCB(err, result){
if( err ){
console.log(FILENAME, 'stepFunc error ', err );
next( err );
}
else
next(null, result);
};
if( noParam )
conn.query( strSQL, queryCB );
else
conn.query( strSQL, queryParam, queryCB );
}
return stepFunc;
}
exports.createStep2 = createStep2;


其中config为数据库的配置文件,参考https://www.npmjs.com/package/mysql#connection-options进行配置。

exports.dbconfig={
port:3306,
host:"localhost",
user:'root',
password :'root',
database:'study'
}


调用方式

var res=yield mysql.executSQL("select * from TABLENAME");
var res=yield mysql.serialSQL(["insert into TABLENAME ...","insert into TABLENAME ..."]);

//item的key和value值需和表结构字段、字段数据类型对应
var item={
key1:'value1',
key2:'value2',
...
//createStep2为正常逻辑,非异步操作,无需加 yield
var step2 = mysql.createStep2('insert into  `TABLENAME`  set ?');
var res=yield mysql.doQuery_g(step2, item);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: