本章结合接口的编写及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中实现注册逻辑。
代码如下:
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数据库中存在一条记录