wake-up-neo.com

node.js async/await mit MySQL

Ich muss alle Ergebnisse synchronisieren und mit async/await-Schlüsselwörtern wie c # an einen String anhängen. 

Ich bin neu bei node.js und ich kann diese neue Syntax nicht an meinen Code anpassen. 

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

wenn Sie sich in Knoten 8+ befinden, können Sie die native util.promisify() mit dem Knoten mysql nutzen.

Vergiss nicht, es mit bind() aufzurufen, damit die this nicht durcheinander kommt:

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

Verwenden Sie das mysql2-Paket. Es hat einen Wrapper versprochen, damit Sie das tun können: 

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

Wenn Sie davon ausgehen, dass Ihr ORM, dass Sie es verwenden, versprechen, können Sie so etwas tun

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

Jedes Versprechen kann mit async/await verwendet werden, indem await vor dem Anruf platziert wird. Beachten Sie jedoch, dass die Funktion this innerhalb einer async-Funktion "wrapper" verwendet werden muss. Sie müssen die Fehler in try/catch-Blöcken behandeln.

Ich möchte auch darauf hinweisen, dass diese 4 Abfragen nicht / gleichzeitig ausgeführt werden. Dafür müssen Sie noch Promise.all verwenden.

9
adam-beck

Sie müssen sicherstellen, dass die von Ihnen verwendete mysql-Bibliothek entweder Promises unterstützt, die von async/await benötigt werden, oder ein Werkzeug wie Bluebirds promisifyAll verwenden, um die Bibliothek einzubinden.

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

Beachten Sie, dass der Aufruf von appendedText() tatsächlich ein Versprechen und keinen Wert zurückgibt.

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

Es scheint, dass Sie mysqljs verwenden, was keine versprochene Bibliothek ist. Sie können also mit dieser Bibliothek nicht das erreichen, was Sie möchten. Sie können also eine versprochene Bibliothek wie Sequelize verwenden oder als Kommentar Folgendes vorschlagen:

verwenden Sie ein Tool wie Bluebirds PromisifyAll, um die Bibliothek zu verpacken.

Ich weiß nicht viel über das Umwickeln von Dingen, also habe ich auf Sequelize umgestellt.

0

Wenn Sie mysql (auch als mysqljs bezeichnet) verwenden möchten, müssen Sie ein wenig arbeiten, wenn Sie keinen Wrapper verwenden möchten. Aber es ist leicht genug. So würde die Connect-Funktion aussehen:

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()

Wie Sie sehen, wird das Erwarten wissen, wie Sie mit einem Versprechen umgehen. Sie erstellen eine solche Funktion und verwenden die Auflösungs-/Ablehnungsfunktionen in der Callback-Implementierung. Das ist alles, was es wirklich gibt. Wenn Sie also einen Wrapper verwenden, ist das ein bisschen viel, wenn Sie nicht viel auf Ihre Datenbank zugreifen.

0
Alexis Wilke