【问题标题】:Nodejs: Unable to get query results and store in arrayNodejs:无法获取查询结果并存储在数组中
【发布时间】:2020-10-12 14:16:55
【问题描述】:

这是我的代码

const mysqlssh = require('mysql-ssh');
var Promise = require('promise');


const startSSHSQLTunnel = () =>{
    return mysqlssh.connect(
        {
            host: 'xxx.xxx.xx.xxx',
            user: 'ball',
            password: 'r252_bat'
        },
        {
            host: '192.xxx.xxx.xxx',
            user: 'portal',
            password: 'r252_bat',
            database: 'mydb'
        }
    )
}

exports.getSignupSummary = async() => {
    let res = []
    let queryStrings = ['SELECT year, WorkWeek, COUNT(*) AS Count from (SELECT YEAR(signed_up) as year, WEEK(signed_up) as WorkWeek from `chatbots` where signed_up is not null) temp_table group by WorkWeek, year',
    'SELECT year, WorkMonth, COUNT(*) AS Count from (SELECT YEAR(signed_up) as year, MONTH(signed_up) as WorkMonth from `chatbots` where signed_up is not null) temp_table group by WorkMonth, year',
    'SELECT COUNT(*) as count from `chatbots`']
    //SELECT COUNT(*) as count from `chatbots`; 
    getUserData = function(qs, cb) {
        startSSHSQLTunnel().then(client => {
          client.query(qs, 
          function(err, results) { 
            if (err)
              return cb(err);
            cb(undefined, results);
        })});
      }
      
      // Usage:
    queryStrings.map(x => { 
        getUserData(x, 
            function(err, results) {
                res.push(results);
                }
            )
        });

    console.log(res);
}

我正在尝试获取查询结果并存储在一个名为“res”的数组中 但是我面临以下问题

  1. 回调函数的结果可以被 console.logged 但如果我存储在数组中然后尝试打印出来,我会看到一个空数组。

  2. 我尝试使用 async -> await 但没用

  3. 我试图将所有内容封装在一个新的承诺中,然后解决结果,但这没有意义,因为我得到了一个空的承诺

请指教

【问题讨论】:

  • 看起来像一个异步问题,我认为当你console.log它时数组没有填充
  • 我确实尝试过等待,但我得到了未决的承诺
  • 我认为你可以使用 .map 函数在getUserData 上返回一个承诺数组,然后使用await Promise.all 来解决这些承诺
  • 可以分享代码吗?
  • 下面回答,如果不行告诉我,我们会调试

标签: mysql node.js


【解决方案1】:

你应该试试这样的:

exports.getSignupSummary = async() => {
  let queryStrings = ['SELECT year, WorkWeek, COUNT(*) AS Count from (SELECT YEAR(signed_up) as year, WEEK(signed_up) as WorkWeek from `chatbots` where signed_up is not null) temp_table group by WorkWeek, year',
  'SELECT year, WorkMonth, COUNT(*) AS Count from (SELECT YEAR(signed_up) as year, MONTH(signed_up) as WorkMonth from `chatbots` where signed_up is not null) temp_table group by WorkMonth, year',
  'SELECT COUNT(*) as count from `chatbots`']
  //SELECT COUNT(*) as count from `chatbots`; 
  getUserData = function(qs, cb) {
    startSSHSQLTunnel().then(client => {
      client.query(qs, function(err, results) { 
        if (err) return cb(err);
        cb(undefined, results);
      });
    });
  }
      
  // Usage:
  const promises = queryStrings.map(x => {
    return new Promise((resolve, reject) => {
      getUserData(x, function(err, results) {
        if (err) reject(err);
        resolve(results);
       });
     });
   });
   const res = await Promise.all(promises);
      
   console.log(res);
}

此代码使用.map 函数为您的每个查询创建一个承诺并将其存储在一个数组中。

然后我们使用await Promise.all 等待所有的promise 被解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 2018-12-27
    • 1970-01-01
    • 2013-12-07
    • 2021-12-28
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多