NodeJS查询MySQL返回undefined,登录认证功能异常求助
MySQL登录认证中db.query()返回undefined的解决方案
问题描述
我尝试从MySQL数据库获取数据,与表单数据对比完成登录认证,但遇到db.query()查询返回undefined的问题。控制台显示打印result.userid时输出undefined。
以下是我的index.js代码:
app.post("/api/get/signin", (req,res)=>{ const userid = req.body.userId; userIdG = userid; const password = req.body.password; const consumerKey = req.body.consumerKey; const sqlSelect = `SELECT userid FROM signup WHERE userid = ? AND password = ? AND consumerKey = ?`; db.query(sqlSelect,[userid , password , consumerKey], (err, result)=> { console.log(result.userid); console.log(err); if(result.userid == userid && result.password == password && result.consumerKey == consumerKey) { console.log("Successfully Login"); auth = true; } else { console.log('Local'); console.log(userid); console.log(password); console.log(consumerKey); console.log("UnSuccessfully Login"); auth = false; } }) })
问题原因
- 查询结果结构错误:
db.query()执行SELECT语句后返回的result是匹配记录组成的数组,不是单个对象,直接访问result.userid必然得到undefined。 - 查询字段不完整:SQL语句仅查询
userid,后续代码却试图访问result.password和result.consumerKey,这两个字段根本不存在。 - 缺失错误处理:未先判断数据库查询是否出错,若查询失败会直接导致逻辑异常。
- 登录逻辑冗余:SQL已通过WHERE条件完成匹配,无需在代码中重复对比,只需判断是否有匹配记录即可。
修复后的代码
app.post("/api/get/signin", (req,res)=>{ const userid = req.body.userId; userIdG = userid; const password = req.body.password; const consumerKey = req.body.consumerKey; // 查询所需的全部字段,也可使用SELECT *(字段较少时) const sqlSelect = `SELECT userid, password, consumerKey FROM signup WHERE userid = ? AND password = ? AND consumerKey = ?`; db.query(sqlSelect, [userid, password, consumerKey], (err, result)=> { // 优先处理数据库查询错误 if (err) { console.error("数据库查询出错:", err); auth = false; return res.status(500).send("服务器内部错误"); } // 通过结果数组长度判断是否匹配到用户 if (result.length > 0) { console.log("登录成功"); auth = true; res.send({ success: true, message: "登录成功" }); } else { console.log('本地提交的数据:'); console.log(userid); console.log(password); console.log(consumerKey); console.log("登录失败"); auth = false; res.send({ success: false, message: "账号、密码或Consumer Key错误" }); } }) })
重要提示
- 密码安全:绝对不要明文存储密码!使用bcrypt等哈希算法加密后再存入数据库,登录时对用户输入的密码哈希后再与数据库中的哈希值对比。
- 全局变量风险:
userIdG和auth作为全局变量,在多用户并发场景下会出现数据混乱,建议使用Session或JWT管理登录状态。 - 前端响应:必须给前端返回响应(如
res.send()),避免前端长期处于请求等待状态。
内容的提问来源于stack exchange,提问作者Adam Saleem
相关产品推荐
相关产品推荐

