【问题标题】: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,我在上面定义了一个客户端 :)。

【问题讨论】:

    标签: javascript mysql node.js function mysql2


    【解决方案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 时容易混淆,就像我一样!我会说像我上面的问题那样使用承诺。

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多