我是编码初学者。
我想抓取很多网页,所以这是我的代码。 第一个参数有 2 个参数:主机和路径。 它将通过 forEach 调用第二个函数“getXml”,并为其提供主机和路径以逐一抓取网页。
它通常有效,并在无法获取网页时告诉我错误消息。但有时它不会显示任何错误,程序就卡在那里。我在第二个代码中添加了两个 console.log 来看看会发生什么, console.log(' block 完成'); console.log('http 结束'); 当程序再次卡住的时候。 命令行上的消息是
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
是因为网络连接(有时不稳定)吗?如果是的话,这种情况该如何处理?
有人能给我一些帮助和建议吗?我将非常感激。谢谢。
我的 Node 版本是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);
});
});
};
最佳答案
我添加了 setTimeout() 以在 10 秒后中止请求,并同时拒绝 Promise。不知道有没有用。
第二个代码:
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);
});
});
};
关于javascript - nodejs http请求卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40857221/