如果没有结果,请检入数据库,然后使用node.js-mysql添加

时间:2014-08-31 09:03:13

标签: node.js

当我解析页面时,我得到了许多标题。必须在数据库中检查每个标题,如果没有将其添加到数据库中,则执行此操作。

示例列表:

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);
                    });
                }
            });
        });

结果:当数据库是干净的或包含标题的非记录时,脚本会将所有标题添加到具有重复项的数据库中。当我第二次启动它时,它会显示找到标题的记录,它将跳过。

1 个答案:

答案 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正则表达式应该是什么(它看起来像你的原始代码中被截断了),所以我猜对了。