node.js async / await utilizando con MySQL

Necesito sincronizar todos los resultados y adjuntarlos a una cadena con palabras clave async / await como c #

Soy nuevo en node.js y no puedo adaptar esta nueva syntax a mi código.

var string1 = ''; var string2 = ''; var string3 = ''; var string4 = ''; DatabasePool.getConnection(function(err, connection) { connection.query(query,function (err, result) { if (err){}; string1 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); // i need to append all these strings to appended_text but // all variables remain blank because below code runs first. var appended_text = string1 + string2 + string3 + string4; }); 

Suponiendo que su ORM que está utilizando basado en la promesa puede hacer algo como esto

 async function buildString() { try { const connection = await DatabasePool.getConnection(); const string1 = await connection.query(query); const string2 = await connection.query(query); const string3 = await connection.query(query); const string4 = await connection.query(query); return string1 + string2 + string3 + string4; } catch (err) { // do something } } 

Cualquier promesa puede usarse con async / await poniendo a la await delante de la llamada. Sin embargo, tenga en cuenta que esta función debe utilizarse dentro de una función async “wrapper”. Necesitas manejar los errores en try/catch bloques try/catch .

También quiero señalar que estas 4 consultas no se ejecutan de forma simultánea. Aún necesitarás usar Promise.all para eso.

Utilice el paquete mysql2. Tiene un envoltorio prometedor para que puedas hacer eso:

 async function example1 () { const mysql = require('mysql2/promise'); const conn = await mysql.createConnection({ database: test }); let [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]); } 

Si está en el Nodo 8+ , puede aprovechar el util.promisify() nativo con el nodo mysql.

No te olvides de llamarlo con bind() para que this no se arruine:

 const mysql = require('mysql'); // or use import if you use TS const util = require('util'); const conn = mysql.createConnection({yourHOST/USER/PW/DB}); // node native promisify const query = util.promisify(conn.query).bind(conn); (async () => { try { const rows = await query('select count(*) as count from file_managed'); console.log(rows); } finally { conn.end(); } })() 

promisifyAll asegurarse de que la biblioteca mysql que está utilizando admite Promesas, que son requeridas por async / await , o usar una herramienta como promisifyAll de Bluebird para envolver la biblioteca.

 async function appendedText() { const connection = await DatabasePool.getConnectionAsync(); const [string1, string2, string3, string4] = await [ connection.query(query1), connection.query(query2), connection.query(query3), connection.query(query4), ]; return string1 + string2 + string3 + string4; } 

Tenga en cuenta que llamar a appendedText() devolverá una Promesa y no un valor.

 appendedText().then(appended_text => {}); 

Parece que usas mysqljs que no está prometida biblioteca basada. Así que no puedes lograr lo que quieres usando esta biblioteca. Entonces, lo que puede hacer es usar una biblioteca basada prometida como Sequlize . o bien, como sugiere un comentario

use una herramienta como Bluebird’s promisifyAll para envolver la biblioteca.

No sé mucho sobre el tema de la deformación, así que lo que hice fue cambiar al secuestro.