web-dev-qa-db-fra.com

Comment passer des paramètres au callback de requête mysql dans nodejs

J'essaie de trouver le bon moyen de transmettre des données personnalisées à un appel de requête pour qu'il soit disponible dans le rappel .. .. J'utilise la bibliothèque MySQL dans nodejs (toutes les dernières versions).

J'ai un appel à connection.query (sql, function (err, result) {...});

Je ne pouvais pas trouver un moyen de 1) transmettre des données/paramètres personnalisés à l'appel afin que 2) ils puissent être rendus disponibles lorsque le rappel est appelé . Quel est le moyen approprié de le faire?

J'ai le suivant (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;
    };
}

À partir du code ci-dessus, je dois pouvoir transmettre la valeur courante de "ix" utilisée dans la requête au rappel lui-même.

Comment je fais ça?

13
Julio

Si vous utilisez node-mysql, procédez comme suit:

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

    }
);

Les documents ont également un code pour l'échappement correct des chaînes, mais l'utilisation du tableau dans l'appel de requête effectue automatiquement l'échappement pour vous.

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

25
Chris

Pour répondre à la question initiale avec une réponse complète/un exemple à illustrer, encapsulez le rappel avec une fonction anonyme qui crée immédiatement une étendue contenant un "instantané" si vous voulez des données transmises.

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

Pour ceux qui découvrent ce concept, comme je l’étais il ya 20 minutes, le dernier}) (ix)); est la valeur de var ix = 1 externe dans laquelle est passée (fonction (ix) {. Ceci pourrait être renommé (fonction (abc) {si vous avez modifié le fichier console.log ("ix =" + abc); 

fwiw (Merci Chris pour le lien qui a rempli les blancs pour arriver à une solution)

6
sday

Bien qu'il soit correct de passer des variables ou des objets à une fonction de rappel de requête mysql en utilisant la tactique décrite précédemment - en englobant la fonction de rappel dans une fonction anonyme -, je pense que cela est largement inutile et je vais expliquer pourquoi avec un exemple:

// 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);

Produit la sortie suivante:

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

La crainte est que le deuxième appel à run_query () écrase la variable y et/ou y1 avant que le premier appel à run_query () ait une chance d'invoquer sa fonction de rappel. Cependant, les variables dans chaque instance de la fonction appelée run_query () sont en réalité isolées les unes des autres, ce qui sauve la journée.

0
bearvarine