项目场景:
使用node.js响应注册请求,同时判断数据库中没有已注册的用户名
问题描述
遇到return
代码不会停止,而会继续执行,从而导致了如下错误
Cannot set headers after they are sent to the client
将做出响应部分的代码提取如下:
exports.register = (req, res) => {
const userinfo = req.body
console.log(req.body);
if (!userinfo.username || !userinfo.password) {
return res.send({
status: 1,
message: 'cannot be null'
})
}
let sql = 'select * from user where username=?'
db.query(sql, [userinfo.username], function(err, results){
if (err) {
return res.send({
status: 1,
message: err.message
})
}
if (results.length > 0) {
return res.send({
status: 1,
message: 'username existed'
})
}
})
userinfo.password = bcryptjs.hashSync(userinfo.password, 10)
console.log(userinfo.password);
sql = 'insert into user set ?'
db.query(sql, {
username: userinfo.username,
password: userinfo.password
}, (err, results) => {
if (err) {
return res.send({
status: 1,
message: err.message
})
}
return res.send({
status: 0,
message: 'register successfully'
})
})
}
原因分析:
因为这里使用的是数据库连接池,query
是一个异步的方法,后边的代码自然会执行,想到这个原因后,笔者尝试使用async await
的方式进行修改,但是效果不佳且产生了很多问题,比如:只要提交Post请求服务就会被迫停止,然后再次产生上述问题
解决方案:
笔者只会老老实实的再次使用嵌套,修改后代码如下:
exports.register = (req, res) => {
const userinfo = req.body
console.log(userinfo);
if (!userinfo.username || !userinfo.password) {
return res.send({
status: 1,
message: 'cannot be null'
})
}
let sql = 'select * from user where username=?'
db.query(sql, [userinfo.username], (err, results) => {
if (err) {
return res.send({
status: 1,
message: err.message
})
}
if (results.length > 0) {
return res.send({
status: 1,
message: 'username existed'
})
}
userinfo.password = bcryptjs.hashSync(userinfo.password, 10)
sql = 'insert into user set ?'
db.query(sql, {
username: userinfo.username,
password: userinfo.password
}, (err, results) => {
if (err) {
return res.send({
status: 1,
message: err.message
})
}
res.send({
status: 0,
message: 'register successfully'
})
})
})
}