私はnodejsの初心者であり、すべての非同期のものに慣れています。
以下を使用します。-Node-MySQL(https://github.com/felixge/node-mysql)-今すぐリクエスト(https://github.com/mikeal/request)モジュール。
URLの大きなリスト(10,000個のURL)をクエリし、HTTPステータスを取得するためにHTTPGETリクエストを送信しようとしています。
それは機能しますが、問題は、コードを実行すると、MySQLクエリの各行が返されるときに、processURL関数が呼び出され、各URL値の直後に「BEFORE」と「AFTER」がログに記録されることです(理解できます)HTTPリクエストを送信しますが、MySQLクエリが完了するのを待ってからHTTPステータスを返します。
単純に、クエリの実行中にこれらのURLをチェックして結果を返すことはできません。クエリが完了するのを待って、HTTPリクエストの結果を返します。
これは、各行がストリーミングされるときにprocessURL関数を実行するため、私には無意味に見えます。完全なコードは次のとおりです。
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'urlDB',
});
var query = connection.query('SELECT * FROM urls LIMIT 10000');
query.on('error', function(err) {
console.log(err);
})
query.on('result', function(row) {
processURL(row.urlValue, function() {
});
console.log(row.urlValue);
})
function processURL (url){
var request = require('request');
var startTime = new Date();
console.log('BEFORE');
request({
uri: url,
method: 'GET',
}, function(error, response, body) {
console.log('INSIDE');
var endTime = new Date();
if (!error) {
console.log(response.statusCode + ' Start: ' + startTime + ' End: ' + endTime);
} else {
console.log('timeout');
}
})
console.log('AFTER');
}
出力は次のとおりです。www.google.comBEFOREAFTERwww.yahoo.com BEFORE AFTER www.cnn.com BEFORE AFTER ...ただし、クエリが完了するまで「INSIDE」はありません。
どんな助けでもありがたいです、そしてどうもありがとう。