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() 内部查询的结果?
顺便说一下,喜欢这个名字...真的很喜欢那部电影。关于你的问题,我有几点建议:
如果您有很多查询,您可以考虑独立于查询移动连接,这样连接的设置和拆卸就不是查询本身的时间成本的一部分.如果您有单个连接、单个数据库等,那么您可以在启动时实例化一次连接,然后保持连接打开,并在您的查询中引用它。
你的问题:
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')
}
)
}
好的,所以我需要通过 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() 内部查询的结果?
顺便说一下,喜欢这个名字...真的很喜欢那部电影。关于你的问题,我有几点建议:
如果您有很多查询,您可以考虑独立于查询移动连接,这样连接的设置和拆卸就不是查询本身的时间成本的一部分.如果您有单个连接、单个数据库等,那么您可以在启动时实例化一次连接,然后保持连接打开,并在您的查询中引用它。
你的问题:
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')
}
)
}