2014-08-31 35 views
0

當我解析一個頁面時,我得到了一些標題。每個標題必須在數據庫中檢查,如果它沒有添加到數據庫中,則執行該操作。檢入數據庫,如果沒有結果,然後添加node.js-mysql

列表示例:

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

您的.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正則表達式應該是(它看起來就像是在原始代碼切斷),所以我猜。

相關問題