return 来自 .then() 的结果

return results from .then()

好的,所以我需要通过 SSH 连接到 MySQL 数据库并且连接正常。我能够毫无问题地执行查询。我也可以得到结果并打印出来。问题是,我需要一些更简单的东西,因为我将不得不向这个数据库发送大量查询。下面是创建到该数据库的连接的承诺代码。

const SSHConnection = new Promise((resolve, reject) => {
    sshClient.on('ready', () => {
        sshClient.forwardOut(
            forwardConfig.srcHost,
            forwardConfig.srcPort,
            forwardConfig.dstHost,
            forwardConfig.dstPort,
            (err, stream) => {
                if (err) reject(err);
                const updatedDbServer = {
                    ...dbServer,
                    stream
                };
                const connection = mysql.createConnection(updatedDbServer);
                connection.connect((error) => {
                    if (error) {
                        reject(error);   // Return error
                    }
                    resolve(connection); // OK : return connection to database
                });
        });
    }).connect(tunnelConfig);
});

然后我有这段代码可以让我访问所述连接并允许我发送查询。问题是我需要查询的 return 值,并且能够在我的项目的其他模块中使用它。例如,导出单个函数以用于发送 sendQuery('Enter SQL here').

等查询
function sendQuery(sql) {
    SSHConnection.then(
        function(connection) {
            connection.query(
                sql,
                function(err, results, fields) {
                    return results; // <---------- I want to return this from the function 'sendQuery()'
                }
            );
        },
        function(error) {
            console.log("Something wrong happened");
        }
    );
}

我可以使用 SSHConnection.then() 中的结果,但这对我来说不起作用。 我想要下面类似的东西来工作。

// Main function
(async function() {
    let res = sendQuery(`SELECT 23+2 AS Sum;`);
    console.log(res); // Outputs Sum: 25
})();

所以我的问题。有没有办法从外部访问 promise.then() 内部查询的结果?

顺便说一下,喜欢这个名字...真的很喜欢那部电影。关于你的问题,我有几点建议:

  1. 如果您有很多查询,您可以考虑独立于查询移动连接,这样连接的设置和拆卸就不是查询本身的时间成本的一部分.如果您有单个连接、单个数据库等,那么您可以在启动时实例化一次连接,然后保持连接打开,并在您的查询中引用它。

  2. 你的问题:

function sendQuery(sql) {
    const resValues = await SSHConnection.then(
        function(connection) {
            connection.query(
                sql,
                function(err, results, fields) {
                    return results; // <---------- I want to return this from the function 'sendQuery()'
                }
            );
        },
        function(error) {
            console.log("Something wrong happened");
        }
    );
    return(resValues); // or handle error cases
}

请注意,我从“.then()”调用中添加了一个 return 值,它捕获了您的“结果”return 值,然后 returns 来自父项函数(发送查询)

我认为问题在于您需要在代码中添加另一个 return 语句。

function sendQuery(sql) {
    return SSHConnection.then(
        function(connection) {
            return connection.query(
                sql,
                function(err, results, fields) {
                    return results; // <---------- I want to return this from the function 'sendQuery()'
                }
            );
        },
        function(error) {
            console.log("Something wrong happened");
        }
    );
}

如果 connection.query return 是一个承诺,这应该 return 查询的结果正确。我不确定是否如此。如果是,那么您可以像这样执行函数。

// Main function
(async function() {
    let res = await sendQuery(`SELECT 23+2 AS Sum;`);
    console.log(res); // Outputs Sum: 25
})();

如果 connection.query 没有 return 承诺,那么我想你可以像这样用承诺包装它。

function sendQuery (sql) {
  return SSHConnection.then(
    function (connection) {
      return new Promise((resolve, reject) => {
        connection.query(
          sql,
          function (err, results, fields) {
            if (err)reject(err)
            resolve(results) // <---------- I want to return this from the function 'sendQuery()'
          }
        )
      })
    },
    function (error) {
      console.log('Something wrong happened')
    }
  )
}