Maison >base de données >tutoriel mysql >Comment Async/Await peut-il résoudre les problèmes de concurrence lors de l'interrogation de MySQL dans Node.js ?

Comment Async/Await peut-il résoudre les problèmes de concurrence lors de l'interrogation de MySQL dans Node.js ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-29 01:41:12569parcourir

How Can Async/Await Solve Concurrency Issues When Querying MySQL in Node.js?

Exécution asynchrone dans Node.js : utilisation d'Async/Await avec MySQL

En tant que nouveau venu dans Node.js, vous pouvez rencontrer des difficultés à vous adapter sa syntaxe moderne, en particulier lorsque vous travaillez avec des opérations asynchrones. Explorons comment utiliser les mots-clés async/await pour obtenir des résultats synchronisés lors de l'interrogation d'une base de données MySQL.

Dans votre code, vous souhaitez exécuter plusieurs requêtes et concaténer les résultats en une seule chaîne. Cependant, comme Node.js exécute le code JavaScript de manière non bloquante, le code ci-dessous ne garantit pas que les variables string1 à string4 contiendront les résultats attendus :

// Original Code
var string1 = '';
var string2 = '';
var string3 = '';
var string4 = '';

DatabasePool.getConnection((err, connection) => {
  // Query 1
  connection.query(query, (err, result) => {
    string1 = result;
  });

  // Query 2
  connection.query(query, (err, result) => {
    string2 = result;
  });

  // Query 3
  connection.query(query, (err, result) => {
    string3 = result;
  });

  // Query 4
  connection.query(query, (err, result) => {
    string4 = result;
  });

  // Attempt to concatenate results
  var appended_text = string1 + string2 + string3 + string4;
});

Solution avec Async/ Attendre

Pour résoudre ce problème et permettre une exécution synchrone, Node.js 8 fournit la fonction util.promisify(). Voici comment l'intégrer à la bibliothèque MySQL :

// Improved Code
const mysql = require('mysql');
const util = require('util');
const conn = mysql.createConnection({ yourHOST, yourUSER, yourPW, yourDB });

// Promisify the query method
const query = util.promisify(conn.query).bind(conn);

(async () => {
  try {
    // Execute queries concurrently
    const [query1Result, query2Result, query3Result, query4Result] = await Promise.all([
      query('select count(*) as count from file_managed'),
      query('another query'),
      query('another query'),
      query('another query'),
    ]);

    // Concatenate results
    const appended_text = query1Result[0].count + query2Result[0].count + query3Result[0].count + query4Result[0].count;
  } finally {
    // Close the connection
    conn.end();
  }
})();

Dans ce code révisé :

  • La méthode de requête est convertie en promesse à l'aide de util.promisify().
  • La fonction bind() garantit que cela fait toujours référence à l'objet d'origine.
  • La méthode Promise.all() exécute les quatre requêtes simultanément et renvoie un tableau de résultats.
  • Les résultats sont extraits et concaténés dans appended_text.
  • Enfin, la connexion est fermée.

Cette approche vous permet de synchronisez de manière transparente vos requêtes et obtenez le résultat souhaité de manière fiable, faisant de async/wait un outil puissant pour gérer les opérations asynchrones dans Node.js.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn