带有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 选择查询将不会返回正确的结果

MYSQL优化

带有“%%”参数的 Postgres 查询未通过 psycopg2 返回结果

MySQL:想把查询结果作为返回值返回,这个SQL函数该怎么写?返回值类型该填啥?

mysql数据库查询没有数据的时候会返回啥,是false,还是' ',还是null,还是啥啊?