刚刚开始接触node,现在在写短信验证码的功能,但是在操作数据库的时候我发现每个异步函数都有一个err,这个err我觉得是应该不会出现的,但是免不了可能会出现,所以每个都要判断吗?而且在里面是做什么操作呢?而且我现在这样写下去,代码嵌套的特别厉害。。。求各位大哥给点思路和指导 代码如下: 1、client是redis实例化出来的
// 验证短信验证码
exports.verifyCode = function (req, res) {
// 获取用户传递的手机号和验证码
let phone = req.query.phone;
let upCode = req.query.code;
if (client.get(phone)) {
client.get(phone, function (err, msgCode) {
if (upCode == msgCode) {
// 从连接池获取连接
pool.getConnection(function (err, connection) {
// 获取前台页面传过来的参数
var param = req.query || req.params;
// 检查数据库是否有手机号
connection.query(userSQL.getIdByMobile, param.phone, function (err, result) {
if (err) {
res.send(jsonTool.send_json(-1, '注册失败', ''));
} else {
if (result.length != 0) { // 不为0,说明之前注册过,直接返回之前的user_id
res.send(jsonTool.send_json(0, '登录成功', result[0].user_id.toString()));
} else { // 为0,添加用户
connection.query(userSQL.insertMobile, param.phone, function (err, result) {
if (err) throw err;
// 添加成功并返回给前端
connection.query(userSQL.getIdByMobile, param.phone, function (err, result) {
if (result.length != 0) {
res.send(jsonTool.send_json(0, '注册成功', result[0].user_id.toString()));
} else {
res.send(jsonTool.send_json(-1, '注册失败', ''));
}
});
});
}
}
// 释放连接
connection.release();
});
});
} else {
res.send(jsonTool.send_json(-1, '验证码错误', ''));
}
});
} else {
res.send(jsonTool.send_json(-1, '验证码已过期', ''));
}
}
1.代码嵌套的特别厉害
: callback hell ,现在解决它的方式太多了,最常用的就是Promise
2.每个异步函数都有一个err
: 这个err肯定是要处理的,这种错误一般都是操作数据库失败啊什么的,就是它底层产生的错误
同样你redis里的err也应该处理,虽然就像你说的,这个err我觉得是应该不会出现的,但是还是有可能出现
@imhered 老哥,我想问一下,这个err,我怎么处理?比如插入数据库的时候出错了,这个时候我直接返回给前端说,验证失败吗?然后结束整个函数?
错误都返回了, 函数就已经结束了。
err 出现了, 直接 res.json({code: 500, message: ‘message’}),然后前端看看是否需要提示,还是怎样处理。
建议处理方案:1,使用 promise; 2,在catch 中进行统一的错误处理,3, 有一处错误了整个就返回,不用在再经过继续执行下去。
其实,这些问题都不是 javascript 的问题, 你用 java 也会有问题, 也要各种各样的 try … catch 。
@htoooth 额,node是异步回调,也可以用try…catch吗?老哥,你说的err的处理我明白了,只要错了就返回对应的信息。。。但是这个统一处理我没明白、、、我百度了,说解决代码嵌套用async这个三方
for node 8+
var Redis =require( 'redisng')
const redis = new Redis()
(async function () {
try {
await redis.connect()
await redis.set('KEY', 'VALUE')
var v = await redis.get('KEY')
console.log(v)
} catch (e) {
console.log(e.message, e.stack)
}
})()
先看Promise吧…