wake-up-neo.com

Wie man Parameter an mysql query callback in nodejs übergibt

Ich versuche, den richtigen Weg zu finden, benutzerdefinierte Daten an einen Abfrageaufruf zu übergeben, der im Callback verfügbar gemacht werden soll .. Ich verwende MySQL-Bibliothek in nodejs (alle neuesten Versionen).

Ich habe einen Aufruf an connection.query (sql, function (err, result) {...});

Ich konnte keinen Weg finden, um 1) benutzerdefinierte Daten/Parameter an den Aufruf zu übergeben, sodass 2) verfügbar gemacht werden kann, wenn der Rückruf aufgerufen wird ... Was ist der richtige Weg, dies zu tun?

Ich habe folgendes (Pseudo-Code):

...
for (ix in SomeJSONArray) {
    sql = "SELECT (1) FROM someTable WHERE someColumn = " + SomeJSONArray[ix].id;
    connection.query(sql, function (err, result) {
      ...
      var y = SomeJSONArray[ix].id;
    };
}

Aus dem obigen Code muss ich in der Lage sein, den aktuellen Wert von "ix", der in der Abfrage verwendet wird, an den Rückruf selbst zu übergeben.

Wie mache ich das?

13
Julio

Wenn Sie node-mysql verwenden, machen Sie es so, wie es die Docs sagen:

connection.query(
    'SELECT * FROM table WHERE id=? LIMIT ?, 5',[ user_id, start ], 
    function (err, results) {

    }
);

Die Dokumente verfügen auch über Code zum korrekten Escaping von Zeichenfolgen. Die Verwendung des Arrays im Abfrageaufruf führt jedoch automatisch zum Escaping.

https://github.com/felixge/node-mysql

25
Chris

Um die erste Frage mit einer vollständigen Antwort/einem Beispiel zu beantworten, um das zu veranschaulichen, wickeln Sie den Rückruf mit einer anonymen Funktion ein, die sofort einen Bereich erstellt, der einen "Schnappschuss" enthält, wenn Sie die übergebenen Daten erhalten.

var ix=1;
connection.query('SELECT 1',
    (function(ix){
        return function(err, rows, fields) {
            console.log("ix="+ix);
            console.log(rows);
        };
    })(ix));

Für diejenigen, die dieses Konzept vor 20 Minuten noch nicht kennen, das letzte}) (ix)); ist der äußere Wert für var ix = 1, an den übergeben wird (Funktion (ix) {. Dies könnte umbenannt werden (Funktion (abc) {wenn Sie die console.log geändert haben ("ix =" + abc); 

fwiw (Danke Chris für den Link, der die Lücken füllte, um zu einer Lösung zu gelangen)

6
sday

Es ist zwar in Ordnung, Variablen oder Objekte mit der zuvor beschriebenen Taktik an eine mysql query callback-Funktion zu übergeben - die Callback-Funktion in eine anonyme Funktion zu hüllen - ich denke, das ist weitgehend unnötig, und ich erkläre warum mit einem Beispiel:

// This actually works as expected!

function run_query (sql, y) {
    var y1 = 1;
    connection.query (sql, function (error, rows, fields) {

        if (! error)
        {
            var r = rows[0];

            console.log ("r = " + r[1]);
            console.log ("x = " + x);
            console.log ("y = " + y);
            console.log ("y1= " + y);
            console.log ("");
        }
        else
        {
            console.log ("error = " + error);
        }
    });
};

var x = 5;

console.log ("step 1: x = " + x);

run_query ("SELECT 1", x);

x = x + 1;

console.log ("step 2: x = " + x);

run_query ("SELECT 1", x);

x = x + 1;

console.log ("step 3: x = " + x);

Erzeugt die folgende Ausgabe:

step 1: x = 5
step 2: x = 6
step 3: x = 7
r = 1
x = 7
y = 5
y1= 5

r = 1
x = 7
y = 6
y1= 6

Die Befürchtung ist, dass der zweite Aufruf von run_query () die Variablen y und/oder y1 überschreibt, bevor der erste Aufruf von run_query () die Möglichkeit hat, seine Callback-Funktion aufzurufen. Die Variablen in jeder Instanz der aufgerufenen Funktion run_query () sind jedoch tatsächlich voneinander isoliert, wodurch der Tag gespart wird.

0
bearvarine