node.js学习(十一、mysql存储实例)

本章结合接口的编写及mysql存储,编写用户注册的例子。
先在mysql中创建一个数据库study,接着创建一个表user_account

CREATE TABLE `user_account` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  `user_pw` varchar(30) NOT NULL COMMENT '密码',
  `reg_time` datetime NOT NULL COMMENT '注册时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user` (`user_name`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

注册接口

websvr.handleReq("/reg/:username/:password",index.regUser,app);

在index.js中实现注册逻辑。

Created with Raphaël 2.1.0 获取接口参数 判断用户名是否注册过? 标识注册失败 返回结果 注册 标识注册成功 yes no

代码如下:

function* regUser(params) {
    var ret = {
        code: 0,
        msg: "success"
    };
    var regtime = myUtil.now();
    var passpw = myUtil.md5(params.password + regtime);
    var sql = "select user_id from user_account where user_name='" + params.username + "'";
    var re = yield mysql.executSQL_g(sql);
    if(re.err || re.length == 0) {
        var user = {
            user_name: params.username,
            user_pw: passpw,
            reg_time: regtime
        }
        var step2 = mysql.createStep2("insert into user_account set ?")
        var res = yield mysql.doQuery_g(step2, user);
        console.log(res);
    } else {

        ret.code = -1;
        ret.msg = "用户已注册";
    }

    return ret;
}
exports.regUser = regUser;

在执行过程中发现re 并没有err和data属性,这是由于co模块引起的。co模块会造成异常无法捕捉.故在websvr.js中对co进行修改。

function handleReq(path,func_g,app){
    app.get(path,function(req,res){
        co(function *(){
            var result = yield * func_g( req.params);
            res.send(result);
        });

    });
}
exports.handleReq=handleReq;

var co = function (flow) {
    var generator = flow();
    var next = function (data) {
        var ret = generator.next(data);
        //console.log('get generator return:', ret );
        if (!ret.done) {
            if (Array.isArray(ret.value)) {
                var count = 0;
                var total = 0;
                var results = [];
                //console.log('is array');
                if( ret.value.length ){
                    ret.value.forEach(function (item, index) {
                        total++; //总计数
                        count++; //标识
                        if( typeof(item) == 'function' )
                            item(function (err, data) {
                                count--;
                                results[index] = {err:err,data:data};
                                if (count === 0 && total === ret.value.length ) {
                                    next(results);
                                }
                            });
                        else{
                            count--;
                            results[index] = {err:item[0],data:item[1]}; //arg
                            if (count === 0 && total === ret.value.length ) {
                                next(results);
                            }
                        }

                    });
                }else{
                    next(null);//空数组
                }
            } else {
                if( typeof(ret.value ) == 'function' )
                    ret.value(function (err, data) {
                        next({err:err,data:data});
                    });
                else
                    next({err:ret.value[0],data:ret.value[1]}); //arg
            }
        }
    }
    next()
}
exports.co = co;

修改后运行正常,调用接口http://goodboy.ren:3000/reg/981884394@qq.com/E10ADC3949BA59ABBE56E057F20F883E返回结果正常,发现mysql数据库中存在一条记录
这里写图片描述

git https://github.com/feng12345566/nodejs_study

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值