Rolf B: node mysql2.query await

Beitrag lesen

Hallo henry,

welchen Mysql-Treiber verwendest Du? mysql von Doug Wilson oder mysql2 von Andrey Sidorov (sidorares)?

mysql2 bietet Promises an und scheint auch noch eher in Pflege zu sein. Doug Wilson hat seit 2 Jahren nichts mehr geändert.

Das habe ich jetzt nur durch eine schnelle NPM Suche ermittelt, ich kann Dir nicht sagen, ob mysql2 soviel taugt wie Andrey vorschwärmt.

Mit einer fertigen, promisegestützten Version kannst Du await verwenden und musst nicht selbst eine Promisehülle bauen. KANN man natürlich auch selbst tun

function queryAsync(conn, sql, args) {
   return new Promise( (resolve, reject) => {
      conn.query(sql, args, (err, results, fields) => {
         if (err) 
            reject(err);
         else
            resolve { results, fields };
      });
   });
}

// der folgende Code muss in einer async-Funktion stehen!

async function read_spsliste(spsname) {
  let ergebnis1 = await.queryAsync(conn, "...", [ ... ]);
  // use ergebnis1.results and ergebnis1.fields

  let ergebnis2 = await.queryAsync(conn, "...", [ ... ]);
  // use ergebnis2.results and ergebnis2.fields

  let ergebnis3 = await.queryAsync(conn, "...", [ ... ]);
  // use ergebnis3.results and ergebnis3.fields
}

Wenn Du read_spsliste aufrufst, bekommst Du ein Promise zurück, und zwar sofort, ohne Wartezeit. Das musst Du wieder mit await erwarten - was voraussetzt, dass der Aufrufer selbst eine async-Funktion ist. Fehler bekommst Du als Exception.

Oder Du verwendest das Promise ungezuckert, also so:

read_spsliste(conn, spsname)
.then(liste => // verarbeite liste)
.catch(error => // verarbeite fehler);

Rolf

--
sumpsi - posui - obstruxi