私はコーディングの初心者です。nodejs http要求が固まった
私は多くのウェブページを掻き集めたいので、私のコードがあります。 最初のものは、ホストとパスの2つの引数をとります。 forEachによって2番目の関数 'getXml'が呼び出され、ホストとパスを指定してWebページを1つずつスクレイプします。
通常は動作し、ウェブページを取得できないとエラーメッセージが表示されます。しかし、時にはそれは何のエラーも表示されず、プログラムはちょうどそこに止まった。 2つ目のコードに2つのconsole.logを追加して、何が起こるかを確認します。 console.log( 'chunk done'); console.log( 'http end'); プログラムが再び停止したとき。 コマンドラインにメッセージが
chunk done
chunk done
chunk done
http end
scrape webpage done(succeed to scrape a webpage)
chunk done
chunk done
http end
scrape webpage done (succeed to scape a webpage)
chunk done
chunk done
chunk done
(somethimes it stucks here, and no message shows, it just don't move on)
私はここに行くとどのようにそれを修正するだか分からないです。 それはこの質問に似ています: request get stuck from nodejs
インターネット接続(時にはuntable)なのですか?もしそうなら、このような状況にどう対処するのですか?
誰かが私に助けを与えてアドバイスしますか?私はそれを非常に感謝しています。ありがとうございました。
マイノードのバージョンがV7.2.0
であり、私はまた、以下のモジュールを使用します。 「6.16.0」、「バベルプリセット最新」:「6.16.0」、「バベルプリセットステージ0」:「6.16.0」、「バベルプリセット」、「バベルプリセット」、「バブルプリセット」、 「: "6.18.0"
まずコード:
import {getXml} from './getXml.js';
import fs from 'fs';
export function scrape(host, paths) {
let ready = Promise.resolve(null);
paths.forEach((path, index) => {
ready = ready.then(() => {
return getXml(host, path);
}).then((xml) => {
// do something with the xml
// I use fs.writeFileSync to save the xml
console.log('scrape', host + path, 'done');
}, (errMessage) => {
// do somthing if there is error
// I use fs.appendFileSync to save the err messages
console.log('scrape failed:', errMessage);
});
});
};
セカンドコード:
import http from 'http';
export function getXml(host, path) {
return new Promise((resolve, reject) => {
let option = {
"host": host,
"path": path
};
http.get(option, (res) => {
let xml = '';
res.setEncoding('utf8');
res.on('data', (chunk) => {
xml += chunk;
console.log('chunk done');
});
res.on('end',() => {
resolve(xml);
console.log('http end');
});
}).on('error', (err) => {
let errMessage = host + path;
reject(errMessage);
});
});
};