dedlfix: Verständnisproblem: MySQL-Queries in Node.js

Beitrag lesen

Tach!

					pool.getConnection(function(err, connection) {
						connection.query(strQuery, function(err, rows) {
							// ...
						});
						connection.release();
					});
					console.log("nachher");

Ich habe mit promise-mysql keine Erfahrung. Aber wenn ich die Dokumentation richtig lese, kann/soll man dem query() als zweitem Parameter nur Werte für die Abfrage mitgeben. Die Dokumentation ist da nicht besonders umfangreich.

Wenn du auf das Fertigstellen der Abfragen reagieren möchtest, wäre da ein .then() anzuhängen (und .catch() für eine Fehlerbehandlung). Andererseits, wenn ich den Code richtig lese, reicht promise-mysql den Aufruf nur an das zugrundeliegende mysqljs/mysql durch, und da übergibt man den Callback direkt als Parameter und nicht im Promise-Stil. Ob das wirklich so geht, kann ich aber nicht mit Bestimmtheit sagen. Es kann sein, dass genau das dein Problem ist, wenn der Callback lediglich als Parameter angesehen wird, für die Query ignoriert wird, weil nicht benötigt, und dann logischerweise kein Aufruf erfolgt.

Der Vorteil von Promises ist größtenteils optischer Natur. Man kann damit Code untereinander schreiben, der zeitlich nacheinander abläuft, was bei mehreren aufeinander folgenden Handlungen übersichtlicher wird. Mit herkömmlichen Callbacks schachtelt man hingegen den nachfolgenden Code in den Callback und erzeugt damit eine immer tiefergehende Schachtelung im Code.

doSomething(() => theFirst(params))
.then(() => theSecond(params))
.then(() => theThird(params))
.then(() => theFourth(params));
doSomething(() => theFirst(params, () => {
  theSecond(params, () => {
    theThird(params, () => {
      theFourth(params)
    })
  })
});

Wenn ich den Promise-Zusatz nähme, würde ich auch nach dessen Philosophie arbeiten und das zugrundeliegende nur im Notfall verwenden. Wenn ich mir aber das folgende Beispiel aus der Dokumentation von promise-mysql anschaue, dann komme ich ins Grübeln, was die da veranstalten.

var mysql = require('promise-mysql');

mysql.createConnection({
    host: 'localhost',
    user: 'sauron',
    password: 'theonetruering',
    database: 'mordor'
}).then(function(conn){
    var result = conn.query('select `name` from hobbits');
    conn.end();
    return result;
}).then(function(rows){
    // Logs out a list of hobbits
    console.log(rows);
});

Die Connection wird asynchron geholt und steht im Callback (sprich: then()) zur Verfügung. Soweit so gut. Im zweiten Teil wird die Query ausgeführt und ihr Ergebnis als Promise zurückgegeben. Dieses Promis kann aber nur im bereits erfüllten Zustand zurückgegeben werden, weil unmittelbar danach die Connection geschlossen wird. Das läuft da also in Wirklichkeit synchron und die Promise-Nutzung ist da nur wegen der then()-Nutzbarkeit anstatt Callback-Verschachtelung.

Wie auch immer. Entscheide dich lieber für diese oder die andere Vorgehensweise. Wenn promise-mysql, dann ignorier die Dokumentation von mysqljs/mysql. Oder nimm ausschließlich mysqljs/mysql. Beides zu mischen hilft dir vermutlich nicht besonders, wenn du generell noch unsicher auf dem Gebiet bist.

dedlfix.