如何将parameter passing给nodejs中的mysql查询callback

我试图找出正确的方式传递自定义数据的查询调用在callback中可用。 我在nodejs(所有最新版本)中使用MySQL库。

我有一个调用connection.query(SQL,function(错误,结果){…});

我无法find一种方法来1)传递自定义数据/参数的调用,以便2)它可以使callback被调用时可用。 那么这样做的正确方法是什么?

我有以下(伪代码):

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

从上面的代码中,我需要能够将查询中使用的“ix”的当前值传递给callback本身。

我怎么做?

如果你正在使用node-mysql,那就像文档一样说:

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

文档也有正确的转义string的代码,但在查询调用中使用数组会自动为您转义。

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

要回答最初的问题,以一个完整的答案/例子来说明,用一个匿名函数包装callback,如果你传入的数据会立即创build一个包含“快照”的范围。

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

对于那些新来的这个概念,我是20分钟前,最后一个})(ix)); 如果你改变了console.log(“ix =”+ abc);如果你改变了console.log(“ix =”)。

fwiw(感谢克里斯为填补空白的链接到达一个解决scheme)

虽然使用前面描述的策略将variables或对象传递给mysql查询callback函数是可以的 – 将callback函数包装在一个匿名函数中 – 我认为这在很大程度上是不必要的,我将用一个例子来解释为什么:

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

生成以下输出:

 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 

担心的是第二次调用run_query()会在第一次调用run_query()之前覆盖variablesy和/或y1,并有机会调用它的callback函数。 但是,被调用的run_query()函数的每个实例中的variables实际上是相互隔离的,从而节省了一天的时间。