Cómo pasar parámetros a mysql consulta callback en nodejs

Estoy intentando descubrir la forma correcta de pasar datos personalizados a una llamada de consulta para que estén disponibles en la callback. Estoy usando la biblioteca MySQL en nodejs (todas las últimas versiones).

Tengo una llamada a connection.query (sql, function (err, result) {…});

No pude encontrar una manera de 1) pasar datos / parámetros personalizados a la llamada para que 2) esté disponible cuando se invoque la callback. Entonces, ¿cuál es la forma correcta de hacerlo?

Tengo el siguiente (pseudo-código):

... 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; }; } 

Desde el código anterior, necesito poder pasar el valor actual de “ix” utilizado en la consulta a la callback.

¿Cómo puedo hacer eso?

Si está utilizando node-mysql, hágalo como dicen los documentos:

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

Los documentos también tienen código para el escape adecuado de cadenas, pero el uso de la matriz en la llamada de consulta hace el escape automáticamente por usted.

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

Para responder a la pregunta inicial con una respuesta / ejemplo completo para ilustrar, envuelva la callback con una función anónima que cree inmediatamente un scope que contenga una “instantánea”, si así lo desea, de los datos pasados.

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

Para aquellos nuevos en este concepto como hace 20 minutos, el último}) (ix)); es el valor externo var ix = 1 que se pasa a (function (ix) {. Esto podría cambiarse de nombre (function (abc) {si cambia la console.log (“ix =” + abc);

fwiw (Gracias Chris por el enlace que llenó los espacios en blanco para llegar a una solución)

Si bien está bien pasar variables u objetos a una función de callback de consulta mysql usando la táctica descrita anteriormente – envolver la función de callback en una función anónima – creo que es en gran medida innecesaria, y explicaré por qué con un ejemplo:

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

Produce la siguiente salida:

 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 

El temor es que la segunda llamada a run_query () sobrescriba la variable y y / o y1 antes de que la primera llamada a run_query () tenga la oportunidad de invocar su función de callback. Sin embargo, las variables en cada instancia de la función run_query () llamada en realidad están aisladas unas de otras, salvando el día.