#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 , вдохновленный такими вопросами, как эти.