Klaus1: node.js und promise-mysql: wie schließe ich korrekt die Verbindungen?

Hallo,

so sieht derzeit ein einfacher Select auf eine Tabelle aus:

				strQuery = 'select * from mytable';
				mysql.createConnection(mysqlConnData)
				.then(function(conn){
					connection = conn;
					var result = connection.query(strQuery);
					return result;
				}).then(function(rows){
					connection.end(function(err) { });
					return;
				}).catch(function(error){
					if (connection && connection.end) connection.end();
					//logs out the error
					console.log("Fehler bei: "+strQuery);
					console.log(error);
				});

Nach Abschluss des Selects möchte ich die Verbindung schließen. Aber entweder ich erhalte solche Meldungen:

Unhandled rejection Error: Cannot enqueue Quit after invoking quit.

Oder:

Unhandled rejection Error: Quit inactivity timeout

Wenn ich das connection.end() weglasse, erhalte ich nach einer Weile die Meldung, dass keine weitere Verbindung geöffnet wwerden kann (max connections reached).

Wenn die Verbindung schon vorher geschlossen wurde, ist es doch eigentlich egal, wenn ich sie "nochmal" schließen möchte. Also Fehler einfach unterdrücken?

Ich verstehe halt nicht, wieso die Verbindung überhaupt schon geschlossen sein könnte oder wie es hierbei zu einem Timeout kommen kann, wenn ich doch die Verbindung direkt wieder schließe. Das Query dauert nur ein Bruchteil einer Sekunde.

LG Klaus

  1. Hallo Klaus1,

    wenn ich deinen Code mit dem Muster auf der npm Seite vergleiche, dann

    • sehe ich keine Deklaration von connection
    • macht das Muster innerhalb eines .then() eine Query vor dem .end(). Ich denke, dass da das Problem liegt. Du musst .end() vermutlich nach dem letzten .query() aufrufen, aber im gleichen .then Block.

    De facto habe ich aber keine Ahnung, ich bin nur gut in pattern matching 😁

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      • sehe ich keine Deklaration von connection

      Das macht nichts weiter, denn dann wird connection implizit beim ersten Schreibzugriff als globale Variable angelegt, so wie es im Beispiel explizit der Fall ist. (Genauer gesagt, wird connection als Eigenschaft von window angelegt.)

      dedlfix.

      1. Hallo dedlfix,

        ok, wenn Node das auch so macht… Irgendwas war da anders, meine ich zu wissen.

        Rolf

        --
        sumpsi - posui - clusi
        1. Tach!

          ok, wenn Node das auch so macht… Irgendwas war da anders, meine ich zu wissen.

          Achja, Node.js, da ist das dann nicht window. Aber einen globalen Scope gibts da auch, der ebenfalls durch das Weglassen von var angesprochen wird, wenn man sich in einem lokalen Scope befindet.

          dedlfix.