我正在试图找出将自定义数据传递给查询调用的正确方法,以便在回调中使用。 我在nodejs(所有最新版本)中使用MySQL库。
我调用了connection.query(sql,function(err,result){...});
我找不到一种方法来1)将自定义数据/参数传递给调用,以便2)在调用回调时可以使它可用。 那么这样做的正确方法是什么?
我有以下(伪代码):
...
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”的当前值传递给回调本身。
我该怎么做?
答案 0 :(得分:26)
如果您使用的是node-mysql,请按照文档说:
进行操作connection.query(
'SELECT * FROM table WHERE id=? LIMIT ?, 5',[ user_id, start ],
function (err, results) {
}
);
文档也有正确转义字符串的代码,但在查询调用中使用数组会自动为你进行转义。
答案 1 :(得分:9)
要用完整的答案/示例来回答最初的问题,请使用匿名函数包装回调函数,该函数会立即创建一个包含"快照的范围"如果您愿意传入数据。
var ix=1;
connection.query('SELECT 1',
(function(ix){
return function(err, rows, fields) {
console.log("ix="+ix);
console.log(rows);
};
})(ix));
对于那些刚接触这个概念的人,就像我20分钟前一样,最后的})(ix));是传递给(function(ix){的外部var ix = 1值。可以重命名(函数(abc){如果你更改了console.log(" ix =" + abc) ;
fwiw(感谢Chris提供了填补空白以获得解决方案的链接)
答案 2 :(得分:0)
虽然可以使用前面描述的策略将变量或对象传递给mysql查询回调函数 - 将回调函数包装在匿名函数中 - 我认为这在很大程度上是不必要的,我将解释为什么举个例子:
// 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()之前覆盖变量y和/或y1,有机会调用它的回调函数。但是,被调用的run_query()函数的每个实例中的变量实际上是彼此隔离的,从而节省了一天。