Node.js puppeteer mysql - вставка извлеченных значений в базу данных внутри цикла с использованием mysql - PullRequest
0 голосов
/ 30 августа 2018

Я использую node.js и puppeteer для получения некоторых данных. ... теперь я хочу вставить извлеченные данные в базы данных ... используя mysql. Кажется, что работает ниже ... все же меня смущает то, что в console.log ('БД вставлено успешно. Запись:' + i); всегда позади и через некоторое время останавливается ... хотя есть таблицы с доступными записями.

Это мое приложение:

  let tableCell01;
  let tableCell01Val;
  let tableCell02;
  let tableCell02Val;

  const tableRows = await page.$$('table.tableFile2 > tbody > tr');

  for (let i=1; i < tableRows.length; i++){

    tableRow = tableRows[i];
    tableCell01 = await tableRow.$('td:nth-child(1) a');
    tableCell01Val = await page.evaluate( tableCell01 => tableCell01.innerText, tableCell01 );
    tableCell02 = await tableRow.$('td:nth-child(2)');
    tableCell02Val = await page.evaluate( tableCell02 => tableCell02.innerText, tableCell02 );

    tableCell02ValA.replace(/(^\s+|\s+$)/g,'');

    console.log('\n');
    console.log('ID: '+tableCell01Val);
    console.log('Company: '+tableCell02Val);
    console.log('Iterator: '+i);

    const insertCompanyList = "INSERT INTO companyList ( company_name, id ) values (?,?)";

    connection.query(insertCompanyList,[tableCell02Val, tableCell01Val],function(err, rows) {
      if (err) {
        console.log(err);
      } else {
        console.log('DB insert successful. Record: '+i);
      }
    });

  }

Это я вижу в консоли:

ID: 3136
Company: Company A
Iterator: 1

ID: 3143
Company: Company B
Iterator: 2
DB insert successful. Record: 1

ID: 4497
Company: Company C
Iterator: 3

ID: 3164
Company: Company D
Iterator: 4

ID: 3219
Company: Company E
Iterator: 5

ID: 3071
Company: Company F
Iterator: 6

ID: 3184
Company: Company G
Iterator: 7
DB insert successful. Record: 2

ID: 3130
Company: Company H
Iterator: 8
DB insert successful. Record: 3
DB insert successful. Record: 4
DB insert successful. Record: 5
DB insert successful. Record: 6
DB insert successful. Record: 7
DB insert successful. Record: 8        

ID: 1844
Company: Company I
Iterator: 1

ID: 3687
Company: Company J
Iterator: 2

ID: 4514
Company: ECompany K
Iterator: 3

ID: 3635
Company: Company L
Iterator: 4

ID: 3884
Company: Company M
Iterator: 5

ID: 3482
Company: Company N
Iterator: 6
DB insert successful. Record: 1

ID: 3482
Company: Company O
Iterator: 7

ID: 1827
Company: Company P
Iterator: 8
DB insert successful. Record: 2

ID: 1827
Company: Company Q
Iterator: 9

ID: 6465
Company: Company R
Iterator: 10

ID: 0731
Company: Company S
Country: B9
Iterator: 11
No pagination!
DB insert successful. Record: 3
DB insert successful. Record: 4
DB insert successful. Record: 5
DB insert successful. Record: 6
DB insert successful. Record: 7
DB insert successful. Record: 8
DB insert successful. Record: 9
DB insert successful. Record: 10
DB insert successful. Record: 11

Чего мне не хватает? Я думаю, мне нужно поместить запрос на соединение в async.function ?! Как здесь: Ошибка вставки значений в цикле (для) в базе данных: вставлено то же значение - узел js / sql .?

1 Ответ

0 голосов
/ 30 августа 2018

Просто пообещайте connection.query, чтобы вы могли await его. Ссылка на другой вопрос, который вы разместили, очень похожа на вашу проблему.

Этот вопрос задают снова и снова, потому что его трудно понять, но в основном connection.query запускается сразу, переходит на следующую строку, а затем на какой-то момент позже (когда база данных отвечает и цикл обработки событий имеет время для ее обработки). ) function(err, rows) {} частей работает. Таким образом, в промежутке между некоторыми из ваших кукловодов (или другими асинхронными процессами) он обрабатывает function(err,rows){}.

Следующее предложение: научитесь использовать util.promisify! ( 1011 **

  let tableCell01;
  let tableCell01Val;
  let tableCell02;
  let tableCell02Val;

  const tableRows = await page.$$('table.tableFile2 > tbody > tr');

  for (let i=1; i < tableRows.length; i++){

    tableRow = tableRows[i];
    tableCell01 = await tableRow.$('td:nth-child(1) a');
    tableCell01Val = await page.evaluate( tableCell01 => tableCell01.innerText, tableCell01 );
    tableCell02 = await tableRow.$('td:nth-child(2)');
    tableCell02Val = await page.evaluate( tableCell02 => tableCell02.innerText, tableCell02 );

    tableCell02ValA.replace(/(^\s+|\s+$)/g,'');

    console.log('\n');
    console.log('ID: '+tableCell01Val);
    console.log('Company: '+tableCell02Val);
    console.log('Iterator: '+i);

    const insertCompanyList = "INSERT INTO companyList ( company_name, id ) values (?,?)";

    let rows = await new Promise((resolve,reject)=>{
      connection.query(insertCompanyList,[tableCell02Val, tableCell01Val],function(err, rows) {
        if (err) {
          console.log(err);
          reject(err);
        } else {
          console.log('DB insert successful. Record: '+i);
          resolve(rows);
        }
      });
    });

  }

...