私は、取得し、解析したデータを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);
}
問題がある:
私はrequest
、cheerio
、async
とmysql
を使用しています。 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)
ご返信ありがとうございます。どこに 'save(json、callback)'を置く必要がありますか?そしてクローラーからどこにコールバックする必要がありますか? – eltomaco
現在の例で 'save(json)'を 'save(json、callback)'に置き換えてください。それはそれを行う必要があります。 https://github.com/caolan/async#eachcoll-iteratee-callbackで 'async.each'のドキュメントもチェックしてください。ファイル保存の例はあなたの状況に非常によく似ています。ファイル)。 – ahwayakchih
残念ながら、これは 'async.each'の最初の繰り返しに対してのみ機能します。その後、私は 'エラー:コールバックはすでに呼び出されています.'というメッセージが表示されます。 – eltomaco