【问题标题】:How to pass parameters to mysql query callback in nodejs如何将参数传递给nodejs中的mysql查询回调
【发布时间】:2013-12-28 21:59:54
【问题描述】:

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

我该怎么做?

【问题讨论】:

    标签: mysql node.js callback


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 至于在回调中使用'ix',将查询放在它自己的函数中,或者自调用anon。功能。 (我还是太新,无法编辑自己的答案...)
    • 谢谢 Chris,但我的问题不在于 SQL 字符串本身内的数据编码,而是在于传递我希望通过回调返回的附加数据,而不是结果集的一部分。正如您在我的示例中看到的那样,ix 值将是外部循环中的当前值,而不是我在数组索引中使用的值。
    • 这就是我添加第一条评论的原因。将整个查询包装在一个自调用匿名中。函数,所以当你到达回调时'ix'不会改变你。
    • 是的,如果我可以将 IX 的值保持在回调的范围内,那么是的,这将有所帮助,而不必弄清楚如何通过调用传递数据并返回回调.只是为了明确您的建议,您将如何在这一切周围放置一个包装匿名函数?
    【解决方案2】:

    要使用完整的答案/示例来回答最初的问题,请使用匿名函数包装回调,如果您愿意的话,该函数会立即创建一个包含“快照”的范围。传入的数据。

    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 值。如果您更改了 console.log("ix="+abc); 则可以重命名为 (function(abc){);

    fwiw(感谢 Chris 提供的链接填补空白以得出解决方案)

    【讨论】:

    • 这是OP问题的解决方案
    【解决方案3】:

    虽然使用前面描述的策略将变量或对象传递给 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() 函数的每个实例中的变量实际上是相互隔离的,从而节省了时间。

    【讨论】:

    • 您在查询中的打印输出有console.log("y1= " + y) 而不是y1,我假设它总是会为y1 打印输出1
    【解决方案4】:

    MySQL con.query 有重载函数。在回调内部,您使用全局变量或传递给函数参数的任何变量。例如:

    示例1:它需要sql stringcallback函数

    var adr = 'Mountain 21';
    var sql = 'SELECT * FROM customers;
    con.query(sql, function (err, result) {
      if (err) throw err;
      console.log(adr);
    });
    

    示例2:它需要sql字符串、参数回调函数

    var adr = 'Mountain 21';
    var sql = 'SELECT * FROM customers WHERE address = ?';
    con.query(sql, [adr], function (err, result) {
      if (err) throw err;
      console.log(adr);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 2016-07-06
      • 2018-09-30
      • 2017-03-08
      • 2017-01-26
      • 1970-01-01
      相关资源
      最近更新 更多