【问题标题】:Nodejs Mysql query with mysql variables cannot save result带有mysql变量的Nodejs Mysql查询无法保存结果
【发布时间】:2021-02-20 06:17:12
【问题描述】:

我一直在尝试将此查询结果保存到变量中,但没有成功。当我直接从工作台运行查询时,我得到了结果,如果我从节点运行它,我得到以下结果

set @count=(select column from table where value = 'value');
SET @row_number = 0; 
select column from 
(SELECT 
    (@row_number:=@row_number + 1) AS num, 
   column
FROM
    table where column is null
ORDER BY column)as a
 where num <= @count

这段代码基本上是根据保存到@count 的值从tableA 中选择X 行

var dnum = []; 
    dbconn.query('SET @row_number = 0;' +
     'set @count=(select column from table where column= "value");' +
     'select column from \n '+ 
     '(SELECT \n' +
     '    (@row_number:=@row_number + 1) AS num, \n' + 
     '   column \n' +
     'FROM \n' +
     '    table where column is null \n' +
     'ORDER BY column )as a \n' +
     'where num <= @count  ;',function(err,rows,result)     {
         console.log(rows)
         dnum = rows or //dnum.push(rows)
     })
     console.log(dnum)

样本输出:

 [
  OkPacket {
    fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 10,
    warningCount: 0,
    message: '',
    protocol41: true,
    changedRows: 0
  },
  OkPacket {
    fieldCount: 0,
    affectedRows: 0,
    insertId: 0,
    serverStatus: 10,
    warningCount: 0,
    message: '',
    protocol41: true,
    changedRows: 0
  },
  [
    RowDataPacket { number: '123456789' },
    RowDataPacket { number: '098745612' }
  ]
]

我想将返回的 RowDataPacket 结果保存到一个变量中以在其他地方使用。

谢谢

【问题讨论】:

  • 提示:考虑使用Sequelize 和 Promises 来帮助组织您的代码,而不是原始驱动程序和回调函数。
  • 只是一个建议。连接nodejs和mysql请使用mysql2github.com/mysqljs/mysql

标签: javascript mysql node.js


【解决方案1】:

应该很简单:

rows.forEach(row => dnum.push(row.number));

如果您从多个查询返回多个结果,您可能需要跳到正确的一个。这可以通过解构响应来完成:

dbconn.query('...', ,function(err,[ _ok1, _ok2, rows ], result) {
  rows.forEach(row => dnum.push(row.number));
}

_ok1_ok2 在那里只是用来吸收对您的 SET 声明的“不关心”响应。

【讨论】:

  • 谢谢,但它不起作用。我的方法可能有些不对劲。我对此还是很陌生。可能与它被调用/解雇的方式有关。变量没有被分配可能是因为它在推送时不存在
  • 如果您具体解释一下您正在使用的数据库驱动程序/库以及 rows 包含的内容,将会有所帮助。你应该改用result 吗?
  • 我正在使用 mysql 库。行结果为 [ RowDataPacket { number: '1234567890' }, RowDataPacket { number: '0987654321' } ] 返回选定的数字
  • 您应该可以使用此代码,因为.number 应该可以处理这些对象。你能给出比“不工作”更专业的描述吗?它会出错吗?如果是这样,您得到的 exact 错误是什么?
  • 也许最好提一下,我是从 express 调用这个查询,前端有一个按钮,点击时会触发一系列请求。
【解决方案2】:

感谢@tadman 的所有 cmets。显然我之前的查询方法确实返回了预期的结果,但不知何故它不可用。我能够通过下面的代码实现这一点。不确定代码是否干净或合理,但它现在可以完成这项工作。直到我在其他地方搞砸了:)

function getNumbers(){
    return new Promise(function(resolve, reject) {
    var q = queue ///This part is returned from express frontend
    let sql1 = 'set @count=(select number from table where name= ? )';
    let sql2 = 'SET @row_number = 0';
    let sql3 =  'select number from \n '+ 
    '(SELECT \n' +
    '    (@row_number:=@row_number + 1) AS num, \n' + 
    '   number \n' +
    'FROM \n' +
    '    numbers where isSelected is null \n' +
    'ORDER BY number)as a \n' +
    'where num <= @count  ;'   
 


    dbconn.query(sql1,q, (err, fields) => {
    if (err) {
        return reject(err);
    } 
    
    });
    dbconn.query(sql2, (err,fields) => {
        if (err) {
            return reject(err);
        }
    }) 
        dbconn.query(sql3, (err, rows, fields) => {
            if (err) {
                return reject(err);
            }
            resolve(rows); 
            
        })
    
    })
    }
    //////////////////////////return number//////////////////////////////
    let dnum =[];

    getNumbers().then((rows) => {
    
    for (let i = 0; i < rows.length; i++) 
    
       // console.log(rows[i].number)    
        dnum.push(rows[i].number)
        console.log(dnum)       
    
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2014-11-23
    • 1970-01-01
    • 2014-08-26
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多