【问题标题】:return results from .then()从 .then() 返回结果
【发布时间】:2021-11-10 16:27:52
【问题描述】:

好的,所以我需要通过 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);
});

然后我有这段代码可以让我访问所述连接并允许我发送查询。问题是我需要查询的返回值,并且能够在我的项目的其他模块中使用它。例如,导出单个函数以用于发送查询,如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() 内部的查询结果?

【问题讨论】:

    标签: javascript mysql node.js ssh-tunnel


    【解决方案1】:

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

    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 返回一个承诺,这应该会正确返回查询的结果。我不确定是不是这样。如果是这样,那么您可以像这样执行该函数。

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

    如果 connection.query 没有返回一个承诺,那么我想你可以像这样将它包装在一个承诺中。

    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')
        }
      )
    }
    

    【讨论】:

    • 看起来查询没有返回承诺,但将其包装在一个中就可以了!
    • 建议在这里使用 promise 和 try/catch 块中的拒绝函数添加错误处理。
    【解决方案2】:

    顺便说一句,喜欢这个名字……真的很喜欢那部电影。至于你的问题,我建议几件事:

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

    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()”调用中添加了一个返回值,它捕获您的“结果”返回值,然后从父函数 (sendQuery) 返回该值

    【讨论】:

    • 是的,我知道每次我需要发送查询时打开连接并不是最好的方法,我对 javascript 有点陌生,所以我会看看我是否找不到一个好的方法去做。谢谢你的提示!至于你的第二个建议,我只有一个似乎被卡住的“未决承诺”:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2012-12-19
    相关资源
    最近更新 更多