如何将参数传递给nodejs中的mysql查询回调

时间:2013-12-28 21:59:55

标签: mysql node.js callback

我正在试图找出将自定义数据传递给查询调用的正确方法,以便在回调中使用。 我在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”的当前值传递给回调本身。

我该怎么做?

3 个答案:

答案 0 :(得分:26)

如果您使用的是node-mysql,请按照文档说:

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

    }
);

文档也有正确转义字符串的代码,但在查询调用中使用数组会自动为你进行转义。

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

答案 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()函数的每个实例中的变量实际上是彼此隔离的,从而节省了一天。