Рекурсивная функция не дает времени на запрос к БД

#javascript #mysql #node.js

#javascript #mysql #node.js

Вопрос:

Я пытаюсь создать простой веб-сканер, но у меня возникают проблемы с сохранением посещенных ссылок в моей базе данных, вот мой код:

 function scrape() {
  connection.query("SELECT * FROM dictionary WHERE scraped=false LIMIT 1", (err, res2) => {
    if (err) throw err;
    let initialUrl = res2[0].url;
    let dataId = res2[0].id;
    rp(initialUrl).then(function (html) {
      connection.query(`UPDATE dictionary SET scraped=true WHERE id=${dataId}`)
      if (html) {
        const $ = cheerio.load(html);
        $("a").each(function () {
          if ($(this).attr("href")) {
            let childUrl = $(this).attr("href");
            let pat = /^https?:///i;
            if (pat.test(childUrl)) {
              urlExists(childUrl, (err, existance) => {
                if (err) throw err;
                if (existance) {
                  connection.query(`SELECT * FROM dictionary WHERE url='${childUrl}'`, (err, res) => {
                    if (err) throw err;
                    if (res.length == 0) {
                      console.log(res.length, res, childUrl);
                      connection.query(`INSERT INTO dictionary (url, scraped) VALUES ('${childUrl}', false)`);
                    }
                  })
                };
              });
            };
          };
        });
      };
    })
  })
  setTimeout(scrape, 1000);
}
scrape();
  

Вот вывод консоли перед сохранением ссылок на БД:

введите описание изображения здесь

Как вы можете видеть, последние два URL-адреса запускают запуск базы данных, потому что я установил url столбец как UNIQUE (потому что мне нужна только одна «копия» каждого URL-адреса), на самом деле я использовал второй запрос, чтобы проверить, существует ли URL-адрес, который я пытаюсь вставить, но это не такработает.

Это что-то связанное с задержкой базы данных или что-то в этом роде?

Комментарии:

1. Разве фактическая очистка не должна проходить внутри обратного вызова запроса на ОБНОВЛЕНИЕ?

2. это может быть прекрасным примером того, почему мы стараемся избегать обратных вызовов. какая-либо конкретная причина для этого?

3. Если это полезно, я написал статью о лучших шаблонах с использованием MySQL в Node.js , вдохновленный такими вопросами, как эти.