You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误" });
        }
    })
})

重要提示

  1. 密码安全:绝对不要明文存储密码!使用bcrypt等哈希算法加密后再存入数据库,登录时对用户输入的密码哈希后再与数据库中的哈希值对比。
  2. 全局变量风险:userIdG和auth作为全局变量,在多用户并发场景下会出现数据混乱,建议使用Session或JWT管理登录状态。
  3. 前端响应:必须给前端返回响应(如res.send()),避免前端长期处于请求等待状态。

内容的提问来源于stack exchange,提问作者Adam Saleem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:35:21