今天在创建用户注册接口时,出现了两个小问题:①利用遍历对象的方法判断接收的数据是否为空;②判断用户名是否已经存在。经过反复尝试后,最终找到了解决方法,现在分享给大家!
一、遍历对象的方法判断请求的到的数据是否为空
这个问题是为了解决在用户注册时,需要将接收到的数据插入数据库,但是在插入数据库时,肯定需要先判断用户是不是将用户信息填写完整了,所以需要先判断一下是否为空。
起初,在解决这个问题的时候我想到的是使用if-else判断,通过判断获取到的对象中每一个属性的属性值是否为空,去解决这个问题,并且也实现了这个功能,但是在后期发现,这种方法比较繁琐,所有考虑使用遍历数组的方式,实现这个功能。
话不多说,直接上代码:
var obj = req.body;
var count = 400;
for (var k in obj) {
console.log(k, obj[k])
count++;
if (!obj[k]) {
res.send({ code: count, msg: `${k}不能为空` });
return;
}
}
if (!/^1[3-9]\d{9}$/.test(obj.phone)) {
res.send({ code: 405, msg: 'phone格式错误' });
return;
}
这里需要注意的就是:如果还要判断其他条件,判断语句一定要写到for..in的外面,这次就是在这里吃了大亏。
二、判断用户名是否已经存在
当用户在输入用户名时,需要去判断以下用户名是否已经被占用,所以想到了通过查询数据数据库中uname是否等于接收到的uname,但是我在试图实现这个想法的时候出现了一些小错误,导致产生了bug。
因为需要判断在查询完数据库之后,拿到的result是否为空,如果为空,直接响应“用户已经存在”,然后跳出函数体。
接下来上代码:
//创建sql命令,查询用户名是否存在
pool.query('select * from xz_user where uname=?', [obj.uname], (err, result) => {
if (err) throw err;
if (result.length) {
res.send({ code: 406, msg: '用户名已存在' })
return;
//想要实现 判断用户名是否已经存在,通过查询数据库是否存在uname=当前请求回来的uname
//拿到结果后,想要直接结束并响应结果 但是产生了二次响应的问题
}
//创建sql命令,插入数据库
pool.query('insert into xz_user set ?', [obj], (err, result) => {
if (err) throw err;
res.send({ code: 200, msg: '用户注册成功', data: result })
})
});
就是在写查询和插入这两个命令的时候,产生了二次响应的问题,后来发现应该是把插入命令放在查询语句的里面,这样才能让return跳出这个接口函数。
但是如果把两个命令分开写,程序在执行完查询语句的时候,执行完查询命令后,return只是跳出了查询的函数,还会继续执行插叙的命令,所以导致产生二次循环的问题。
正确代码:
我的错误案例: