我正在使用Node和Cheerio构建一个web scraper,对于某个网站,我遇到了以下错误(它只发生在这个网站上,没有其他我试图抓取.
它每次都发生在不同的位置,所以有时它url x会抛出错误,其他时候url x很好,它完全是一个不同的URL:
Error!: Error: socket hang up using [insert random URL, it's different every time]
Error: socket hang up
at createHangUpError (http.js:1445:15)
at Socket.socketOnEnd [as onend] (http.js:1541:23)
at Socket.g (events.js:175:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)
Run Code Online (Sandbox Code Playgroud)
调试非常棘手,我真的不知道从哪里开始.首先,什么IS插座挂断错误?是404错误还是类似错误?或者它只是意味着服务器拒绝连接?
我无法在任何地方找到解释!
编辑:这是一个(有时)返回错误的代码示例:
function scrapeNexts(url, oncomplete) {
request(url, function(err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
$ = cheerio.load(body);
// …Run Code Online (Sandbox Code Playgroud) 我的node.js应用程序正在使用http.requestREST API http://army.gov/launch-nukes,我需要区分三种可能的情况:
Success - 服务器回答是肯定的.我知道我的敌人被摧毁了.Failure- 我从服务器收到错误,或者无法连接到服务器.我还有敌人.Unknown- 建立与服务器的连接后,我发送了请求 - 但不确定发生了什么.这可能意味着请求从未进入服务器,或者服务器对我的响应从未成功.我可能会或可能不会刚刚开始一场世界大战.正如您所看到的,区分案例Failure和Unknown案例非常重要,因为它们具有截然不同的后果和我需要采取的不同行动.
我也非常想使用http Keep-Alive - 我可以说,我有点像一个战争贩子,并计划在突发中提出大量请求(然后很长一段时间都没有)
-
问题的核心是如何将连接错误/超时(即a Failure)与请求放在线路(即a )之后发生的错误/超时分开Unknown.
在伪代码逻辑中我想要这个:
var tcp = openConnectionTo('army.gov') // start a new connection, or get an kept-alive one
tcp.on('error', FAILURE_CASE);
tcp.on('connectionEstablished', function (connection) {
var req = connection.httpGetRequest('launch-nukes');
req.on('timeout', UNKNOWN_CASE);
req.on('response', /* read server response and decide FAILURE OR SUCCESS */);
}
)
Run Code Online (Sandbox Code Playgroud) 我正在编写一个需要与服务器通信的node.js应用程序.它使用以下代码建立http连接:
var client = http.createClient(u.port, u.hostname, u.secure);
client.on("error", function(exception) {
logger.error("error from client");
});
var request = client.request(method, u.path, headers);
Run Code Online (Sandbox Code Playgroud)
我没有在node.js文档中看到任何用于在连接上设置超时的选项,默认情况下它似乎设置为20秒.我遇到的问题是我在中国的用户似乎是一个缓慢或片状的网络,他们有时会遇到连接到美国数据中心的超时.我想将超时时间增加到1分钟,看看是否能为它们修复它.
有没有办法在node.js中这样做?
http.request我正在使用 Node.js(版本 0.10.28)为大量数据(来自 PostgreSQL 数据库的 21,000 行)创建 Ruby API 。问题是请求似乎超时并在 1 分钟后返回 404 错误。我知道这是真的,因为 Ruby API 返回 61 秒的请求,并且我计算了 Node 的请求花费的时间(结果为 60 秒和 404)。但是,如果我wget使用 jQuery,$.ajax超时时间为 4 分钟,我可以获得 21,000 行。很明显,它不可能是 404,因为还有其他获取数据的方式。
我也有点困惑,因为无论我看什么,http.request根据以下说法,直到 2 分钟后才应该超时:
我尝试了几种方法来使其正常工作,包括:设置express的中间件;侦听套接字超时并恢复请求;并将超时设置为0,这样就不会超时。不幸的是,这些方法都不起作用,或者至少从我的理解来看是这样。
为了清楚起见,这是我的代码...设置该限制意味着仅返回 18,000 条记录,这似乎是 API 花费超过 60 秒的截止点:
var http = require('http');
var options = {
path: '/api/records.json?limit=18000',
method: 'GET',
host: 'localhost',
requestCert: true,
rejectUnauthorized: false
};
var req = …Run Code Online (Sandbox Code Playgroud) 有一篇文章:如何在node.js中为客户端http连接设置超时
但没有一个答案会奏效.
所以,我有这样的代码:
var remote_client = http.createClient(myPost, myHost);
var path = '/getData?';
var param = { };
var request = remote_client.request("POST", path,);
// error case
remote_client.addListener('error', function(connectionException){
console.log("Nucleus Error: " + connectionException);
next(connectionException);
});
request.addListener('response', function (response) {
response.setEncoding('utf-8');
var body = '';
response.addListener('data', function (chunk) {
// get the result!
});
});
request.end();
Run Code Online (Sandbox Code Playgroud)
最大的问题是我连接的网址可能会超时.因此,我想设置一个超时,如15秒.如果是,则触发侦听器.
但是,我没有在http.createClient的文档中看到任何超时功能.请指教.谢谢.:)
我找不到有关如何在 NodeJS(使用 Express)中为给定请求设置自定义超时的文档?
以下不起作用......:
https.get("https://externalurl.com", { timeout: 1000 }, (res) => {
resp.on("timeout", () => {
console.log("Never fired");
});
});
Run Code Online (Sandbox Code Playgroud)
这样做也不起作用:
https.get("https://externalurl.com", (req, res) => {
req.setTimeout(1000);
});
Run Code Online (Sandbox Code Playgroud)
这样做也不行...
https.get("https://externalurl.com", (res) => {
})
.setTimeout(1000);
Run Code Online (Sandbox Code Playgroud)
它总是等待超过 1 秒才抛出错误
有人可以帮忙吗?是否有“官方”方法来为给定请求设置自定义超时?
我的完整 server.ts
// Express server
const app = express();
const PORT = process.env.PORT || 80;
const DIST_FOLDER = join(process.cwd(), "dist/browser");
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const {
AppServerModuleNgFactory,
LAZY_MODULE_MAP,
ngExpressEngine, …Run Code Online (Sandbox Code Playgroud)