Ok, entonces necesito conectarme a una base de datos MySQL a través de SSH y la conexión funciona bien. Soy capaz de ejecutar consultas sin ningún problema. También puedo obtener los resultados e imprimirlos. El caso es que necesito algo más simple ya que tendré que enviar muchas consultas a esta base de datos. A continuación se muestra el código de una promesa que crea una conexión a esta base de datos.
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); }); Luego tengo este trozo de código que me da acceso a dicha conexión y me permite enviar consultas. El problema es que necesito el valor de retorno de mis consultas y poder usarlo en otros módulos para mi proyecto. Por ejemplo, exporte una sola función para enviar consultas como 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"); } ); } Puedo trabajar con los resultados dentro SSHConnection.then() pero esto no es funcional para mí. Me gustaría tener algo similar a continuación para trabajar.
// Main function (async function() { let res = sendQuery(`SELECT 23+2 AS Sum;`); console.log(res); // Outputs Sum: 25 })();Entonces a mi pregunta. ¿Hay alguna forma de acceder a los resultados de una consulta dentro de una promesa.entonces(), desde el exterior?
Creo que el problema es que necesita agregar otra declaración de devolución a su código.
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"); } ); }Esto debería devolver los resultados de la consulta correctamente SI connection.query devuelve una promesa. No estoy seguro de si lo hace. Si es así, puede simplemente ejecutar la función así.
// Main function (async function() { let res = await sendQuery(`SELECT 23+2 AS Sum;`); console.log(res); // Outputs Sum: 25 })();Si connection.query no devuelve una promesa, supongo que podría envolverlo en una promesa como esa.
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') } ) }Me encanta el nombre por cierto... realmente me gustó esa película. En cuanto a tu pregunta, te sugiero un par de cosas:
Si tiene muchas consultas, puede considerar mover la conexión independientemente de la consulta, de modo que la configuración y el desmontaje de la conexión no sean parte del costo del tiempo para la consulta en sí. Si tiene una sola conexión, una sola base de datos, etc., puede crear una instancia de la conexión una vez, al inicio, y luego dejar la conexión abierta y hacer referencia a ella en sus consultas.
tu pregunta:
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 }Tenga en cuenta que agregué un valor de retorno de la llamada ".then ()", que captura su valor de retorno de "resultados" y luego lo devuelve desde la función principal (sendQuery)