Node.js中怎么处理操作数据库时的error?每个都要判断吗?
发布于 7 年前 作者 TongCong 4313 次浏览 来自 问答

刚刚开始接触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, '验证码已过期', ''));
    }
}
5 回复

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吧…

回到顶部