带有mysql查询的异步函数不会返回查询结果node.js
Posted
技术标签:
【中文标题】带有mysql查询的异步函数不会返回查询结果node.js【英文标题】:async function with mysql query won't return query results node.js 【发布时间】:2019-11-20 09:56:48 【问题描述】:我有一个使用选择查询查询 mysql 数据库的函数。这一切都在异步函数中。查询一直在返回行告诉我它找不到变量“rollStatus”。
async function PullRollStatus()
return new Promise((resolve,reject)=>
var sql = `SELECT * FROM brawlid$brawlID`
con.query(sql, (error, rows, fields) =>
var rollStatus= []
for (var i in rows)
rollStatus.push(rows[i].Bakuganrolled)
)
console.log(rollStatus)
return rollStatus
)
var rolledcheck = await PullRollStatus();
console.log(rolledcheck)
我以前从未使用过新的 Promise,因为异步函数对我来说仍然是一种新事物。我已经在没有“return new Promise”行的情况下尝试了这个,并且都给出了相同的结果。我已经参考了这个 async and await on MySQL call in node js 我仍然遇到一些问题,或者可能会让我更加困惑,我不知道。任何帮助是极大的赞赏。提前致谢!
【问题讨论】:
【参考方案1】:我必须更多地了解数据库和 brawlID 的值,但是您不要将 return 与 promises 一起使用,而是使用 resolve 和 reject,而且,您正在返回一个 promise,难道您不使用异步的。这是一个经过编辑的示例。注意我使用 mysql.format 将变量传递到查询中,这样可以防止代码注入。
另外,我认为您将使用 where 语句,除非您为每个 brawlID 都有一个表,但如果 brawlID 是表中的一列,这将是有意义的。我更改了函数以获取 brawID 传递参数的值,而不是引用全局变量。
const mysql = require("mysql2/promise");
const mysqlconfig =
host: "localhost",
user: "youruser",
password: "yourpassword"
database: "yourdb"
multipleStatements: true
;
const con = mysql.createConnection(msqlconfig);
function to (promise)
return promise
.then(val => [null, val])
.catch(err => [err]);
function PullRollStatus(brawlID)
return new Promise((resolve,reject)=>
let sql = `SELECT * FROM brawlid WHERE brawlID=?`;
mysql.format(sql,brawlID);
con.query(sql, (error, rows, fields) =>
if (error)
reject(error);
else
let rollStatus = [];
for (let row of rows)
rollStatus.push(row.Bakuganrolled)
console.log(rollStatus);
resolve(rollStatus);
);
);
let brawlIDtoCheck = 1;
let [err,rolledcheck] = await to(PullRollStatus(brawlIDtoCheck));
if (err)
console.log("encountered err",err);
console.log(rolledcheck)
【讨论】:
每个游戏在我的数据库中都有自己的 ID(又名 brawlID)和自己的表,所以我相信不需要 where 语句。在此之前我没有使用 mysql2,只是 mysql,所以我确实安装了它并更改了 require 行以匹配您提供的内容。考虑到这一点,调整您提供的内容,我现在被告知 Bakuganrolled(我的 brawlID 表的一列)现在在之前正确显示时返回为未定义。我不知道 mysql2 和 mysql 之间的区别,所以我可能需要调查并相应地更新。有什么想法吗? 我还应该指定我得到 brawlID,这是一个 8 位数字,生成并保存在不和谐的频道标题中。我也在 async function() 块中完成所有这些工作。 @Zarvix 我要做的是使用 Chrome Node JS 调试器并在 rollStatus.push(rows[i].Bakuganrolled) 行上放一个断点,然后查看行的内容是什么.这应该告诉你你需要知道的一切。 我确实在 .push 行的循环之前做了一个“console.log(rows)”和一个“console.log(rows[0].Bakuganrolled)”,它显示了两行我希望,“Bakuganrolled”列也会显示,以及 rows[0] 的正确结果,所以我不确定为什么它说在循环中的 .push 行时该行是未定义的。我会试试调试器。 哦,我明白为什么它不起作用了……在 for 循环语句中“让 i of rows”代替了“var i of rows”。我将“let”更改为“var”,我不再遇到这个问题,它返回的正是它应该的!非常感谢帮忙。您的回答解决了我的问题,缺少一个小修复!你太棒了!以上是关于带有mysql查询的异步函数不会返回查询结果node.js的主要内容,如果未能解决你的问题,请参考以下文章
带有子查询的 MySQL UPDATE TABLE 不会先执行子查询
DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果
带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果