当我解析页面时,我得到了许多标题。必须在数据库中检查每个标题,如果没有将其添加到数据库中,则执行此操作。
示例列表:
test
test2
test3
test4
test2
test
test5
test4
如你所见,有一些重复。
我的代码:
var $ = cheerio.load(body);
$(".program-table .item").each(function() {
var titleOriginal = $(this).find(".title-original").text().match(/(.+)\s\
var movieYear = titleOriginal[2];
var movieTitle = titleOriginal[1];
connection.query("SELECT id FROM movie WHERE name = ? AND year = ?", [movieTitle, movieYear], function(err, result) {
if (err) return;
if (result.length) {
console.log('Found, ID: %s', result[0].id);
} else {
connection.query("INSERT INTO movie SET name = ?, year = ?", [movieTitle, movieYear], function(err, result) {
if (err) return;
console.log('Not found, adding into database. ID: %s', result.insertId);
});
}
});
});
结果:当数据库是干净的或包含标题的非记录时,脚本会将所有标题添加到具有重复项的数据库中。当我第二次启动它时,它会显示找到标题的记录,它将跳过。
答案 0 :(得分:1)
您的.each()
不会等待查询完成,然后再转到下一个元素。您可以使用类似async的内容来帮助管理:
var async = require('async');
// ...
var $ = cheerio.load(body);
async.each($('.program-table .item'), function(el, cb) {
var titleOriginal = $(el).find('.title-original').text().match(/(.+)\s/)
var movieYear = titleOriginal[2];
var movieTitle = titleOriginal[1];
connection.query('SELECT id FROM movie WHERE name = ? AND year = ?',
[movieTitle, movieYear],
function(err, result) {
if (err) return cb(err);
if (result.length) {
console.log('Found, ID: %s', result[0].id);
cb();
} else {
connection.query('INSERT INTO movie SET name = ?, year = ?',
[movieTitle, movieYear],
function(err, result) {
if (err) return cb(err);
console.log('Not found, adding into database. ID: %s', result.insertId);
cb();
});
}
});
}, function(err) {
// if `err` is set, we had a database query error ...
if (err) throw err;
});
我不确定你的titleOriginal
正则表达式应该是什么(它看起来像你的原始代码中被截断了),所以我猜对了。