如何让函数等到变量'rows'包含mysql查询的结果?

Posted

技术标签:

【中文标题】如何让函数等到变量\'rows\'包含mysql查询的结果?【英文标题】:how do I make a function wait until the variable 'rows' contains the result of a mysql query?如何让函数等到变量'rows'包含mysql查询的结果? 【发布时间】:2021-09-07 06:57:17 【问题描述】:

client.mysqllocal 函数应该返回行。

我当前的代码:https://pastebin.com/hgt2DwSY

 const mysql = require('mysql2');
    
    let pool  = mysql.createPool(
      connectionLimit : 10,
      host            : 'localhost',
      user            : 'user',
      password        : 'passwd',
      database        : 'database',
      waitForConnections: true,
      queueLimit: 0
    );
    
    client.mysqllocal = async function localmysql(mySQL_db, mySQL_query)
      let rows;
         pool.getConnection(async function(err, conn) 
            
          if (err) 
            console.log(err);  
          
    
        conn.changeUser(database : mySQL_db, function(err) 
          if (err) 
            console.log(err);
           
        );
    
          conn.query(mySQL_query), function (error, results, fields) 
            rows = results
          
        conn.release()
      )
      return rows;
    
    
    let func = client.mysqllocal('database','SELECT * FROM `guild_config` WHERE `guild_id` = "guildid"');
    console.log(func);

附:这是一个代码 sn-p,我在上面定义了一个客户端 :)。

【问题讨论】:

【参考方案1】:

在这种情况下,我可能会承诺您的查询功能

 const mysql = require('mysql2');
    
    let pool  = mysql.createPool(
      connectionLimit : 10,
      host            : 'localhost',
      user            : 'user',
      password        : 'passwd',
      database        : 'database',
      waitForConnections: true,
      queueLimit: 0
    );
    
    client.mysqllocal = function localmysql(mySQL_db, mySQL_query) 
      return new Promise((resolve, reject) => 
        let rows;
           pool.getConnection(async function(err, conn) 

            if (err) 
              reject(err);  
            

          conn.changeUser(database : mySQL_db, function(err) 
            if (err) 
              reject(err);
             
          );

            conn.query(mySQL_query), function (error, results, fields) 
              rows = results
            
          conn.release()
        )
        resolve(rows);
      );
    
    
    client.mysqllocal('database','SELECT * FROM `guild_config` WHERE `guild_id` = "guildid"').then(func => console.log(func));

【讨论】:

别忘了await调用client.mysqllocal() ;) @ScottyJamison 我做了这样的事情,但是控制台没有返回任何错误或结果,它是空的。代码:pastebin.com/g0CmYGKb conn.query(mySQL_query), function (error, results, fields) 行,我看到你只是忽略了那个错误变量。如果该错误有值,请尝试对该错误执行拒绝(),并查看是否会导致显示任何有用的错误消息。例如if (error) reject(error) 对不起,我在转换它时错过了那个错误:/【参考方案2】:
const mysql = require('mysql2');

let pool  = mysql.createPool( 
   connectionLimit : 10,
   host            : 'localhost',
   user            : 'user',
   password        : 'passwd',
   database        : 'database'
);

client.getLocal = (db, query, callback) => 
    pool.getConnection((err, con) => 
        if(err) reject(err);

        con.changeUser(
            database: db
        , (err) =>  if(err) reject(err) );

        con.query(query, (error, result, fields) => 
            return callback(result);
        )
    )


client.getLocal('dbname', 'query', (result) => 
    console.log(result)
)

我在这里所做的是指定一个函数inside一个函数,这样我就可以使用查询给我的数据,并且也不需要异步! Promise 更受欢迎,但我认为我的回调更灵活一点,初学者在使用 Promise 时容易混淆,就像我一样!我会说像我上面的问题那样使用承诺。

【讨论】:

以上是关于如何让函数等到变量'rows'包含mysql查询的结果?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 怎么才能做到rownumber序号

sql Prev / Next row - mysql select - 变量,corelated子查询

如何让游戏等到调用函数?

Flutter:如何让页面等到数据加载?

C++遍历mysql结果集,一万条数据花多长时间?

如何让语句等到前一个函数完成?