NodeJS和MySQL:在查询回调中获取数组数据

时间:2015-01-08 13:59:00

标签: mysql node.js amazon-sqs

我正在尝试运行这段代码:

setInterval(function () {

    var params = {
        QueueUrl: 'https://sqs.us-east-1.amazonaws.com/821808622769/Teste', // required
        MaxNumberOfMessages: 10
    };
    sqs.receiveMessage(params, function (err, data) {
        if (err)
            console.log('Erro de SQS:' + err);
        else {
            var retorno = data.Messages;
            for (var i in data.Messages) {

                var queryString = 'SELECT now()'; //dummy query, just for tests
                db_connection.query(queryString, null, function (err, rows, fields) {
                    if (err) {
                        console.log('Erro no BD:' + err);
                        return;
                    }

                    var date = new Date();
                    console.log(retorno[i].Body + ' ' + date.getTime().toString());
                });

            }
            console.log();
        }
    });
}, 30000);

我在AWS SQS中有5条消息,例如:

AWS table data

但是当我运行我的代码时,而不是每个消息的retorno [i] .Body,有时我会重复一条消息,如图中所示

Console output

我的for循环运行从1到5个查询,但是如何将回调内的retorno [i]传递给数据库查询?我的意思是,我该如何识别我正在处理的消息?

1 个答案:

答案 0 :(得分:0)

使用.bind(),您可以将i的内部版本设置为与循环中i的版本相同。

在回调结束时

.bind({i:i})并将内部代码更改为引用this.i

for (var i in data.Messages) {

  var queryString = 'SELECT now()'; //dummy query, just for tests
  db_connection.query(queryString, null, function(err, rows, fields) {
      if (err) {
        console.log('Erro no BD:' + err);
        return;
      }

      var date = new Date();
      console.log(retorno[this.i].Body + ' ' + date.getTime().toString());
    }.bind({
      i: i
    });
  }
}