web-dev-qa-db-fra.com

node.js async/wait à utiliser avec MySQL

Je dois synchroniser tous les résultats et les ajouter à une chaîne avec des mots clés async/wait, comme c # 

Je suis nouveau sur node.js et je ne peux pas adapter cette nouvelle syntaxe à mon code. 

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;


});
5
Burc Hasergin

si vous vous trouvez dans le nœud 8+ , vous pouvez utiliser la fonction native util.promisify() avec le nœud mysql.

N'oubliez pas de l'appeler avec bind() pour que this ne vous trompe pas:

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();
  }
})()
10
Leon li

Utilisez le paquet mysql2. Il a un wrapper de promesse pour que vous puissiez le faire: 

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]);
}
10
mr_squall

En supposant que votre ORM que vous utilisez repose sur des promesses, vous pouvez faire quelque chose comme ça

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

Toute promesse peut être utilisée avec async/wait en mettant await devant l’appel. Cependant, notez que la fonction this doit être utilisée dans une fonction "wrapper" async. Vous devez gérer les erreurs dans les blocs try/catch.

Je tiens également à souligner que ces 4 requêtes sont non exécutées simultanément. Vous aurez toujours besoin d'utiliser Promise.all pour cela.

9
adam-beck

Vous devez vous assurer que la bibliothèque mysql que vous utilisez supporte les promesses, requises par async/await, ou utilisez un outil tel que Bluebird's promisifyAll pour encapsuler la bibliothèque.

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;
}

Notez que l'appel de appendedText() renverra en fait une promesse et non une valeur.

appendedText().then(appended_text => {});
1
Explosion Pills

Il semble que vous utilisiez mysqljs qui n'est pas une bibliothèque promise. Donc, vous ne pouvez pas réaliser ce que vous voulez en utilisant cette bibliothèque. Vous pouvez donc utiliser une bibliothèque basée sur la promesse, telle que Sequelize ou, comme le suggère un commentaire:

utilisez un outil tel que promisifyAll de Bluebird pour emballer la bibliothèque.

Je ne sais pas grand chose à propos de l'emballage, alors ce que j'ai fait est de passer à la suite.

0
Pathum Samararathna

Si vous voulez utiliser mysql (aussi appelé mysqljs), vous devez faire un peu de travail si vous ne voulez pas utiliser de wrapper. Mais c'est assez facile. Voici à quoi ressemblerait la fonction de connexion:

const mysql = require('mysql')

var my_connection = mysql.createConnection({ ... })

async function connect()
{
    try
    {
        await new Promise((resolve, reject) => {
            my_connection.connect(err => {
                return err ? reject(err) : resolve()
            })
        })
    }
    catch(err)
    {
        ...handle errors...
    }
}

connect()

Comme vous pouvez le voir, l’attente saura comment traiter une promesse. Vous en créez un et utilisez les fonctions de résolution/rejet dans l'implémentation de rappel. C'est tout ce qu'il y a à faire, donc utiliser un wrapper peut s'avérer un peu compliqué à moins que vous n'accédiez beaucoup à votre base de données.

0
Alexis Wilke