注册页校验用户名是否存在后后续代码未执行问题排查
问题根因
你遇到的是Node.js异步API的执行顺序问题:db.query 是异步IO操作,调用后会立刻返回,不会等数据库查询结果返回再执行后续代码。你写的判断 if (newuser) 是在 db.query 调用之后同步执行的,此时查询数据库的回调函数还没被触发,newuser 还是初始的 false,所以插入用户的逻辑直接就跳过了。等后面数据库结果返回把newuser改成true的时候,前面的判断逻辑早就执行完了,自然不会再跑插入逻辑。
修复方案
把用户插入的逻辑全部挪到数据库查询的回调函数内部即可,调整后的代码如下:
app.post("/register", (req, res) => { const username = req.body.username; const password = req.body.password; db.query("SELECT * FROM users WHERE username = ?;", [username], (err, result) => { if (err) { return res.send({err: err}) } // 用户名不存在,执行插入逻辑 if (result.length == 0) { console.log(true + "one") bcrypt.hash(password, saltRounds, (err, hash) => { if (err) { console.log(err) return res.send({err: "密码加密失败"}) } db.query( "INSERT INTO users (username, password) VALUES (?,?)", [username, hash], (err, result) => { if (err) { console.log(err); return res.send({err: "用户注册失败"}) } // 插入成功返回结果 res.send({status: 0, msg: "注册成功"}) } ) }) } else { // 用户名已存在的情况也要返回响应 res.send({status: 1, msg: "用户名已存在"}) } }) })
额外优化建议
- 所有异步回调里出现错误时建议加
return,避免后续代码继续执行 - 所有分支逻辑都要给前端返回响应,不要出现请求超时的情况
- 如果想避免多层回调嵌套(回调地狱),可以把
db.query和bcrypt.hash包装成Promise,用async/await语法编写,逻辑会更清晰易维护
内容的提问来源于stack exchange,提问作者solidsnake99
相关产品推荐
相关产品推荐

