Nodejs Asyn c db.end () вызван слишком рано - PullRequest
0 голосов
/ 27 января 2020

У меня есть функция, которая использует for l oop для вставки данных в базу данных. Но db.end () вызывается до завершения выполнения l oop. Я также пытался преобразовать db.query в promise с использованием библиотеки util, и происходит то же самое. Что мне нужно изменить, чтобы .end() не вызывался до тех пор, пока for l oop не закончится?

async function processData(err, data) {
  if (err) {
    throw err;
  }
  let db = mysql.createConnection({ ... });

  let statement = "INSERT INTO Kijiji SET ?";
  db.connect();
  for (let i = 0; i < data.length; i++) {
    let row = data[i];
    scrape(row.url).then(adInfo => {
      //console.log(adInfo);
      let columns = {
        uuid: adInfo.adId
      };
      db.query(statement, columns, function(error) {
        if (error) throw error;
      });
    });
  }
  db.end();
}

Невозможно поставить в очередь Query после вызова quit.

1 Ответ

0 голосов
/ 27 января 2020

Вы ничего не await. Должно быть что-то вроде этого:

async function processData(err, data) {
  if (err) {
    throw err;
  }
  let db = mysql.createConnection({ ... });

  let statement = "INSERT INTO Kijiji SET ?";
  await db.connect();
  for (let i = 0; i < data.length; i++) {
    let row = data[i];
    const adInfo = await scrape(row.url);
    
    let columns = {
      uuid: adInfo.adId
    };
    
    await db.query(statement, columns)
  }
  db.end();
}

Или попробуйте параллельно:

async function processData(err, data) {
  if (err) {
    throw err;
  }
  let db = mysql.createConnection({ ... });

  let statement = "INSERT INTO Kijiji SET ?";
  await db.connect();
  
  await Promise.all(data.map(async row => {
    const adInfo = await scrape(row.url);
    
    let columns = {
      uuid: adInfo.adId
    };
    
    await db.query(statement, columns)
  }));
  
  db.end();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...