【问题标题】:Global scope of last insertId using node.js + mysql使用 node.js + mysql 的最后一个 insertId 的全局范围
【发布时间】:2017-09-25 17:37:14
【问题描述】:

我正在调用函数,以便使用node.jsmysql 模块将一些值插入到数据库表中。该函数在 for 循环内调用,我可以在函数内获取每个 INSERT 查询的最后一个 insertId

我的目的

我想将这些 id's 存储到一个数组中,以便稍后在我的代码中使用它们,但我不能这样做。

- 函数调用

 for(var i=0;i<some_number;i++){
   if (<something is true>){

  var lastid = [];
  //Function calling
  function_a(x, y, z, w,  function(error, result) {
   if(!error){
       lastid.push(result.insertId);
       }
   //To Do
   else{}
  });
 }
}

- 功能

function function_a(a, b, c, d, callback){
//Connection to the DB
const con = mysql.createConnection({
  host: 'host',
  user: 'user',
  password: 'password',
  database: 'database'
});

//DB query
var query = "INSERT INTO my_table (column1, column1, column1, column1) VALUES ('"+a+"', '"+b+"', '"+c+"', '"+d+"')";
con.query(query, (err, rows) => {
 var e = rows.insertId;
 return callback(err, e);
});
con.end(); 
}

问题是我不能在函数外使用 id。

知道我该怎么做吗?这是关于变量范围的吗?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    这里有几个问题,是的,它们部分与变量范围有关。

    var lastid = [];放在for循环之前,这样你就可以在循环之后使用它。但是,由于您在循环中有回调机制,因此您必须等待整个循环完成(从 0 到 some_number-1 调用的所有回调,以便在 lastid 数组中具有正确的值。回调是一件麻烦事, 但你可以用它们或承诺来做。你可以谷歌在 for 循环中处理回调。

    【讨论】:

    • 感谢您的回答。我终于相信这是关于使用回调函数时的变量范围。我对array 进行的每次尝试都是空的。您有什么可以帮助我的例子吗?
    • 它是空的,因为你在 for 循环之后调用它,但是,不能保证 for 循环完成它的迭代。这是因为其中的异步操作(例如数据库查询)。为了做对,可以看看this loop callback pattern,或者this example的promise.each()函数使用。
    【解决方案2】:

    函数function_a 是一个asynchronous 函数。在您的情况下,您可以使用 async 模块来执行此任务:

    var taskIds = Array.apply(null, {length: some_number}).map(Number.call, Number);
    var lastid = [];
    async.eachLimit(taskIds, 32, function (taskId, done) {
      if (<something is true>) {
        function_a(x, y, z, w,  function(error, result) {
          if(!error){
            lastid.push(result.insertId);
          }
          //To Do
          else{}
          done()
        });
      } else {
        done()
      }
    }, function () { 
      // Do some thing with lastid
      console.log(lastid);
    });
    

    【讨论】:

    • 感谢您的回复,但它不起作用..我应该为async.eachLimit 需要一些模块吗?
    • @GeoDim 是的,async 是一个类似于mysql 的辅助模块。 caolan.github.io/async/docs.html
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2017-10-28
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多