Проблемы Node/JSON

Таким образом, я пытаюсь выяснить, почему мой возвращаемый объект каждый раз просто []?
Вот мой код:

var returnObject = [];

db.query(queryString, function(err, rows, fields) {
if (err) throw err;

for (var i in rows) 
{
  console.log('Data: ', rows[i]);

  var marker = 
  {
    o_ID:rows[i].o_ID,
    data:rows[i].data
  };

  returnObject[i]=marker;

  console.log(chalk.red(returnObject[i].o_ID));
  console.log(chalk.red(returnObject[i].data));

}
});

var sqsParams = {MessageBody: JSON.stringify(returnObject), QueueUrl :'---'};

По некоторым причинам, когда я печатаю значения returnObject, они правильные, но когда он попадает в JSON.stringify что-то происходит и отправляет в мою очередь SQS просто [].

Я думал, может быть, избавиться от переменной маркера и просто назначить

returnObject[i]=   {
    o_ID:rows[i].o_ID,
    data:rows[i].data
  };

Но это все равно приводит к тому же вопросу. Есть идеи? Спасибо!

2 ответа

  1. Запросы базы данных в JavaScript обычно асинхронны. Это означает, что код внутри функции обратного function(err, rows, fields)вызова будет выполняться только после выполнения запроса базы данных, в то sqsParamsвремя как назначение будет выполнено сразу после запуска запроса базы данных . В результате код внутри функции обратного вызова не был запущен до васreturnObject, JSON.stringifyи он все еще находится в исходном значении [].

  2. Переменная sqsParams устанавливается вне БД.обратный вызов запроса. Как db.запрос асинхронный, ваш код просто провалится с пустым массивом.

    Переместите переменную sqsParams в обратный вызов, который вы предоставляете db.запрос, например:

            console.log(chalk.red(returnObject[i].o_ID));
            console.log(chalk.red(returnObject[i].data));
        }
        var sqsParams = {MessageBody: JSON.stringify(returnObject), QueueUrl :'---'};
        // Use sqsParams here
    });