关于node.js:如何将参数传递给nodejs中的mysql查询回调

How to pass parameters to mysql query callback in nodejs

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

我打电话给connection.query(sql,function(err,result){...});

我找不到办法1)将自定义数据/参数传递给调用,以便2)在调用回调时可以使它可用。
那么正确的做法是什么?

我有以下(伪代码):

1
2
3
4
5
6
7
8
...
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"的当前值传递给回调本身。

我怎么做?


如果您使用的是node-mysql,请按照文档中的说明进行操作:

1
2
3
4
5
6
connection.query(
    'SELECT * FROM table WHERE id=? LIMIT ?, 5',[ user_id, start ],
    function (err, results) {

    }
);

这些文档还包含用于正确转义字符串的代码,但是在查询调用中使用数组会自动为您进行转义。

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


要用完整的答案/示例来回答最初的问题,请使用匿名函数包装回调,该函数将立即创建一个包含"快照"的作用域(如果您希望传入数据)。

1
2
3
4
5
6
7
8
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){。如果可以更改console.log(" ix =" + abc);

fwiw(感谢Chris提供的链接,该链接填补了空白,从而找到了解决方案)


虽然可以使用前面描述的策略将变量或对象传递给mysql查询回调函数-将回调函数包装在匿名函数中-我认为在很大程度上没有必要,我将举例说明原因:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// 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);

产生以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
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()函数实例中的变量都是相互隔离的,从而节省了一天的时间。