私の Node.js アプリは、処理された情報をクライアントに送り返す前に、サーバー側で 2 種類の http 要求を作成します。
- 最初のタイプのサーバー側リクエストは、外部 API から取得するリンクのリストを取得します (1 つのリクエストのみ)。
- 2 番目のタイプのサーバー側要求は、Web ページの html を取得します (API によって返されるリストには 10 個の URL が含まれているため、10 回繰り返されます)。
10 個の URL が要求されていることを確認しても、8 個の応答しか生成されません。コードは次のとおりです。
app.get('/search', function(clientReq, clientRes) {
console.log(clientReq.query.r);
// first type of request to retrieve the json data containing 10 URLs
var searchReq = https.request({ host: 'myhost.com', path: '/?q=' + clientReq.query.r }, function(searchRes) {
console.log('searching...');
var searchOutput = '';
var communications = [];
var waiting = 0;
searchRes.on('data', function(d) {
searchOutput += d;
});
searchRes.on('end', function() {
var obj = JSON.parse(searchOutput);
for(var i = 0; i < obj.results.length; i++){
waiting++;
console.log(encodeURIComponent(obj.results[i].uniqueId)); // prints 10 URLs
// second type of request, fetches a web page listed in searchOutput
var fetchReq = https.request({ host: 'myhost.com', path: '/?uniqueId='+ encodeURIComponent(obj.results[i].uniqueId) }, function(fetchRes) {
var htmlOutput = '';
console.log("starting to read the fetch response"); // only logs 8 times
fetchRes.on('data', function(d) {
htmlOutput += d;
if (htmlOutput.toString().indexOf("<div>") !== -1) {
var communication = "";
var $ = cheerio.load(htmlOutput.toString().substring(htmlOutput.toString().indexOf("<body "),htmlOutput.toString().indexOf("<div>")));
$('p').each(function (index) {
communication += $(this).text();
});
communications.push({"x":communication});
fetchRes.destroy();
waiting--;
complete();
}
});
fetchRes.on('end', function() {
console.log('this is the end of the fetch response'); // only logs 8 times
});
fetchRes.on('error', function(e) {
console.error(e);
});
});
fetchReq.end(console.log("fetchReq ended")); // prints 10 times
fetchReq.on('error', function(e) {
console.error(e);
});
};
function complete() {
if(waiting === 0) {
clientRes.send(communications);
}
}
});
});
searchReq.end();
searchReq.on('error', function(e) {
console.error(e);
});
});
fetchRes.destroy();
HTML は巨大になる可能性があり、その上部だけが必要なため、私は使用します。
これは、10 番目から始まるコンソールの出力ですfetchReq ended
。
fetchReq ended
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
starting to read the fetch response
this is the end of the fetch response
ご覧のとおり、8 件の応答しかありませんでした。最終結果は、がに到達しないためcommunications
、 がブラウザに送り返されることはありません。waiting
0