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?
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.
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)
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.