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

Node.js中如何正确获取SQL查询函数的返回值并存入变量?

问题根源

  • 你用await等待的this.con.query是回调风格的API,本身不会返回Promise,所以await不会等待回调执行完成,代码会直接走到return response的步骤,此时回调里的赋值逻辑还没执行,返回的永远是空数组。
  • index.js里调用async修饰的sign_in方法时没有加await,此时拿到的usersLoading是一个Promise实例,不是执行完成后的实际返回值。
  • 额外风险:你当前拼接SQL的方式存在严重的SQL注入漏洞,攻击者可以构造特殊的用户名/密码绕开登录验证甚至篡改数据库,必须用参数化查询修复。

修复步骤

第一步:修改db.js的sign_in方法

把回调式的数据库查询包装成Promise,再用await等待执行结果:

async sign_in(user) {
  // 改用参数化查询,避免SQL注入风险
  const fquery = "select * from Users where Username = ? and Password = ?";
  const response = [];
  try {
    // 包装回调逻辑为Promise
    const result = await new Promise((resolve, reject) => {
      this.con.query(fquery, [user.Username, user.Password], (err, result) => {
        if (err) return reject(err);
        resolve(result);
      });
    });
    // 处理查询结果
    if (result.length === 0) {
      response.push({ Condition: "empty" });
    } else {
      response.push({ Condition: "notempty" });
      response.push(result[0]);
    }
    return response;
  } catch (err) {
    console.log("查询出错:", err);
    response.push({ Condition: "error", msg: err.message });
    return response;
  }
}

第二步:修改index.js的登录事件处理逻辑

给回调函数加async修饰,调用sign_in时加await等待结果返回:

socket.on("login", async (User) => {
  console.log(User);
  // 等待async方法执行完成拿到实际返回值
  const usersLoading = await db.sign_in(User);
  console.log("UserLoading is... \n", usersLoading);
  socket.emit("UsersLoading", usersLoading);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:04