相关疑难解决方法(0)

NodeJS - "套接字挂断"实际意味着什么?

我正在使用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

238
推荐指数
12
解决办法
31万
查看次数

node.js在发出http请求时区分错误

我的node.js应用程序正在使用http.requestREST API http://army.gov/launch-nukes,我需要区分三种可能的情况:

  • Success - 服务器回答是肯定的.我知道我的敌人被摧毁了.
  • Failure- 我从服务器收到错误,或者无法连接到服务器.我还有敌人.
  • Unknown- 建立与服务器的连接后,我发送了请求 - 但不确定发生了什么.这可能意味着请求从未进入服务器,或者服务器对我的响应从未成功.我可能会或可能不会刚刚开始一场世界大战.

正如您所看到的,区分案例FailureUnknown案例非常重要,因为它们具有截然不同的后果和我需要采取的不同行动.

我也非常想使用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)

rest timeout http node.js

25
推荐指数
1
解决办法
3万
查看次数

如何在node.js中为客户端http连接设置超时

我正在编写一个需要与服务器通信的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中这样做?

node.js

10
推荐指数
2
解决办法
2万
查看次数

Node.js:http 请求在 1 分钟后超时

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 分钟后才应该超时:

Node.js 文档

GitHub 问题#1

GitHub 问题#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)

javascript connection-timeout node.js express

5
推荐指数
1
解决办法
1万
查看次数

如何在Node.js中为http.createClient设置超时?

有一篇文章:如何在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的文档中看到任何超时功能.请指教.谢谢.:)

timeout node.js

4
推荐指数
1
解决办法
5362
查看次数

如何在 http get nodeJS 上设置自定义超时

我找不到有关如何在 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)

timeout get request node.js express

1
推荐指数
1
解决办法
4085
查看次数

标签 统计

node.js ×6

timeout ×3

express ×2

connection-timeout ×1

get ×1

http ×1

javascript ×1

request ×1

rest ×1