2016-11-29 161 views
0

我是編碼方面的初學者。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); 
    }); 
    }); 
}; 

回答

0

我添加的setTimeout()中止後10秒的請求,並拒絕無極在同時。不知道它是否有用。

二碼:

import http from 'http'; 

export function getHttpXml(host, path) { 
    return new Promise((resolve, reject) => { 
    let option = { 
     'host': host, 
     'path': path 
    }; 
    let errMessage = host + path; 

    // add setTimeout() here 
    let timer = setTimeout(() => { 
     req.abort(); 
     reject(errMessage); 
    }, 10000); 

    let req = http.get(option, (res) => { 
     let xml = ''; 
     res.setEncoding('utf8'); 
     res.on('data', (chunk) => { 
     xml += chunk; 
     }); 
     res.on('end',() => { 

     // add clearTimeout() here 
     clearTimeout(timer); 
     resolve(xml); 
     }); 
    }).on('error', (err) => { 

     // add clearTimeout() here 
     clearTimeout(timer); 
     reject(errMessage); 
    }); 
    }); 
};