我是編碼方面的初學者。nodejs http請求被卡住
我想刮很多網頁,所以有我的代碼。 第一個需要2個參數,主機和路徑。 它將通過forEach調用第二個函數'getXml',併爲它提供主機和路徑來逐個抓取網頁。
它通常工作,並告訴我無法獲取網頁時的錯誤消息。但有時它不會顯示任何錯誤,並且程序就停留在那裏。我在第二個代碼中添加了兩個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
而且我還使用下列模塊。
「babel-polyfill」:「6.16.0」,「babel-preset-latest」:「6.16.0」,「babel-preset-stage-0」:「6.16.0」,「babel-register 「: 「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);
});
});
};