如何将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的代码,但在查询调用中使用数组会自动为您转义。
要回答最初的问题,以一个完整的答案/例子来说明,用一个匿名函数包装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实际上是相互隔离的,从而节省了一天的时间。