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

在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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值