2016-05-23 12 views
0

私は、取得し、解析したデータをMySQL DBに保存するクローラを開発中です。 結果を保存するのは非常にうまくいくが、接続を終了するときには止まっている。何がDBに格納される前にDB接続が終了したことを、NodeJs MySQL DBへの複数のリクエストからJsonを保存

// DB params 
var con = mysql.createConnection({ 
    host: "localhost", 
    user: "user", 
    password: "password", 
    database: "mydatabase", 
}); 

// Open connection to DB 
con.connect(function(err) { 
    if (err) { 
     console.log('Error connecting to Db'); 
     return; 
    } 
    console.log('Connection established'); 
}); 

// Array of Cities to crawl 
var cities = ["olten", "zurich"]; 

// Todays Date 
var today = new Date(); 
... 
today = dd + '.' + mm + '.' + yyyy; 

// Search every city 
async.each(cities, function(item, callback){  
     // The Page to crawl 
     var page = "https://www.thepageto.com/search_xhr?fn=" + /*cities[i]*/ item + "&tn=&db=" + today + "&sort=trip_date&order"; 
     console.log("Visiting page " + page); 
     request(page, function(error, response, body) { 
      if (error) {console.log("Error: " + error);} 
      // Check status code (200 is HTTP OK) 
      console.log("Status code: " + response.statusCode); 
      if (response.statusCode === 200) { 
       // Parse JSON 
       var data = JSON.parse(body); 
       // Use only result > html code 
       var content = data.html.results;     
       // Parse html 
       var $ = cheerio.load(content); 
       // Iterate through offers & Extract information & Store in a Object 
       $('.trip.relative').each(function() { 
        // Empty Object, has the same structure as the Db table 
        var json = {id: "", driver: "", rating: "", date: "", time: "", start: "", stops: "", end: "", price: "", url: "", query: ""}; 
        // Assigning values 
        json.driver = $(this).find('.username').text(); 
         ... 
        // Save filled object in Db 
        save(json, callback); 
       });   
      } 
     }); 
    }, function(err){ 
     if (err) { 
      console.log('could not save'); 
     } else { 
      console.log('lets end connection'); 
      con.end(function(err) {if (err) throw err;}); 
     } 
    } 
); 

function save(item, callback) { 
    con.query('INSERT INTO offers SET ?', item, callback); 
} 

問題がある:

私はrequestcheerioasyncmysqlを使用しています。 con.end()は、実際のクエリの前、またはクエリが完了する前に常に発生します。私は、保存機能が完了したときに何かを返さなければならないという意図を持っています。私がcon.end()なしでスクリプトを実行すると、データはDBに完全に格納されます。 私はノードを使い慣れていますので、まだ学習していますので、これで助けてください。

編集: 私は今取得:

ReferenceError: callback is not defined 
    at save (/home/juki/crawler/crawler.js:143:46) 

と同様に:

Error: Callback was already called. 
    at Query._callback (/home/juki/crawler/node_modules/async/dist/async.js:839:                              36) 

答えて

0

あなたは、クローラからcallbackを呼び出さないように見えます。

また、保存が完了するのを待たずにいるようです。 save関数を再試行してください。コールバックも必要です。

function save(item, callback) { 
    con.query('INSERT INTO offers SET ?', item, callback); 
} 

そしてそれが好き呼び出す:ような何かcallbackはあなたがasync.eachから得るものです

save(json, callback); 

+0

ご返信ありがとうございます。どこに 'save(json、callback)'を置く必要がありますか?そしてクローラーからどこにコールバックする必要がありますか? – eltomaco

+0

現在の例で 'save(json)'を 'save(json、callback)'に置き換えてください。それはそれを行う必要があります。 https://github.com/caolan/async#eachcoll-iteratee-callbackで 'async.each'のドキュメントもチェックしてください。ファイル保存の例はあなたの状況に非常によく似ています。ファイル)。 – ahwayakchih

+0

残念ながら、これは 'async.each'の最初の繰り返しに対してのみ機能します。その後、私は 'エラー:コールバックはすでに呼び出されています.'というメッセージが表示されます。 – eltomaco

関連する問題