【问题标题】:async function with mysql query won't return query results node.js带有mysql查询的异步函数不会返回查询结果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 我仍然遇到一些问题,或者可能会让我更加困惑,我不知道。任何帮助是极大的赞赏。提前致谢!

【问题讨论】:

    标签: mysql node.js asynchronous discord.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”,我不再遇到这个问题,它返回的正是它应该的!非常感谢帮忙。您的回答解决了我的问题,缺少一个小修复!你太棒了!
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 2014-07-20
    • 2015-07-15
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多