узел.js зацикливает вставки базы данных - PullRequest
0 голосов
/ 28 октября 2018

У меня есть приложение с адресным объектом и список людей, связанных с приложением.

{
  field1: value,
  field2: value,
  address: {
    street: value,
    apt: value,
    city: value
  },
  owners: [
    {name: value, etc.},
    {name: value, etc.}
  ]
}

Я передаю владельцам функцию, которая переходит через владельцев и передает информациюдля каждого запроса отключается асинхронная функция:

async function insertAllOwners(appId, owners) {
  for (var i = 0, len = owners.length; i < len; i++) {
    console.log("insert owner", i);
    await insertOwner(appId, owners[i]);
  }
}

вызываемая здесь функция превращает запрос в обещание:

function insertOwner(appId, owner)  {
  let sqlOwner = 'insert into ...';
  return new Promise( ( resolve, reject ) => {
    mySqlClient.query(sqlOwner, [appId, owner.memberType ...], (err, rows) => {
      if ( err )
        return reject( err );
      console.log("rows:", rows);
      resolve( rows );
    } );
  } );
}

Вставка адреса вкладывается во вставку приложения, затемкод, который вызывает цикл вставки владельца, вложен в адрес вставки.Здесь вызывается функция вставки циклического владельца:

      if(app.owners) {
        /* insert owners, then commit.  else, just commit.*/
        insertAllOwners(appId, app.owners).then( result => {
          mySqlClient.commit(function(err, result) {
            if (err) { 
              console.error("ERROR DURING COMMIT:", err);
              mySqlClient.rollback(function() {
                throw err;
              });
            }
            else {
              console.log("commit:",result);
            }
          });                  
        });
      }

Вывод выглядит превосходно, но на самом деле он ничего не фиксирует (новые строки не отображаются).Какие-либо предложения?Выход логирования ниже:

OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 1,
  warningCount: 1,
  message: '',
  protocol41: true,
  changedRows: 0
}

address result:
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 35,
  serverStatus: 1,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

insert owner 0
rows:
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 70,
  serverStatus: 1,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

...

insert owner 4
rows:
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 74,
  serverStatus: 1,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

commit:
OkPacket {
  fieldCount: 0,
  affectedRows: 0,
  insertId: 0,
  serverStatus: 0,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

1 Ответ

0 голосов
/ 28 октября 2018

Во-первых, это не очень хорошая практика для выполнения запроса.

что вы делаете для запуска цикла for, и каждый цикл выполняет каждый запрос.Тем не менее, вы даете нагрузку на MySQL.А также выполнение вашего API займет больше времени.

Я предлагаю этот способ.

In for цикл:

for (var i = 0, len = owners.length; i < len; i++) {
   inserData.push(owners[i]); // Add all data in to array ... 
}

После этого выполнить запрос один раз со всеми данными.

connection.query("INSERT INTO TABLE (columns) VLAUES ? " , insertData)... 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...