2016-11-29 477 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); 
    }); 
    }); 
};