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
相关产品推荐
相关产品推荐

