Request: Solicite a obtenção de ESOCKETTIMEDOUT de forma consistente quando todos os outros clientes trabalharem (http://www.bestbuy.com)

Criado em 10 ago. 2017  ·  6Comentários  ·  Fonte: request/request

Olá,

muito fácil de reproduzir e sempre acontece!

const request = require('request');
const axios = require('axios');
const url = 'http://www.bestbuy.com/';
request({
    url: url,
    timeout: 5000
}, (error, response, body) => {
    if (!error)
        console.log(`request got ${response.statusCode}`);
    else
        console.error(`request got an error`, error);
});

axios.get(url).then((ret) => {
    console.log(`Axios got ${ret.status}`);
});

saídas:

Axios got 200
request got an error { Error: ESOCKETTIMEDOUT
    at ClientRequest.<anonymous> (/Users/amir/dev/test/testVideosFb/node_modules/request/request.js:819:19)
    at Object.onceWrapper (events.js:293:19)
    at emitNone (events.js:86:13)
    at ClientRequest.emit (events.js:188:7)
    at Socket.emitTimeout (_http_client.js:679:10)
    at Object.onceWrapper (events.js:293:19)
    at emitNone (events.js:86:13)
    at Socket.emit (events.js:188:7)
    at Socket._onTimeout (net.js:345:8)
    at ontimeout (timers.js:380:14) code: 'ESOCKETTIMEDOUT', connect: false }

Meu ambiente é o nó 7.7.2 / 8.3.0 e [email protected]

stale

Comentários muito úteis

Acho que bestbuy.com pode estar bloqueando a solicitação devido aos cabeçalhos padrão enviados da solicitação. Se a solicitação for feita com os mesmos cabeçalhos que a solicitação axios está enviando, ele não atinge o tempo limite:

const request = require('request');
const axios = require('axios');
const url = 'http://www.bestbuy.com/';
request({
  url: url,
  timeout: 5000,
  headers: {
    "Accept": "application/json, text/plain, */*",
    "User-Agent": "axios/0.18.0"
  }
}, (error, response, body) => {
  if (!error)
    console.log(`request got ${response.statusCode}`);
  else
    console.error(`request got an error`, error);
});

axios.get(url).then((ret) => {
  console.log(`Axios got ${ret.status}`);
});

Todos 6 comentários

Seria bom ter algum feedback sobre este problema ESOCKETTIMEOUT, já que eu também o recebi e não encontrei nenhuma maneira de resolver esse problema sem alterar este módulo.

O ESOCKETTIMEOUT está relacionado a um problema com o pool de soquetes? Eu pensei então, então eu desativei o pooling de soquetes no nó com

`var http = require ('http');
http.globalAgent.maxSockets = Infinity;

var https = requer ('https');
https.globalAgent.maxSockets = Infinity; `

mas não mudou nada sobre não conseguir o ESOCKETTIMEOUT de alguem como solução para esse erro?

mesmo problema para mim

Descobri que se houver muitas solicitações assíncronas, a exceção ESOCKETTIMEDOUT acontece no linux. A solução alternativa que encontrei é fazer o seguinte:

configurando essas opções para request ():

agent: false, pool: {maxSockets: 100}

Observe que, depois disso, o tempo limite pode diminuir, portanto, talvez seja necessário aumentá-lo.

Mesmo problema aqui +1
agent: false, pool: {maxSockets: 100} não ajudou

Acho que bestbuy.com pode estar bloqueando a solicitação devido aos cabeçalhos padrão enviados da solicitação. Se a solicitação for feita com os mesmos cabeçalhos que a solicitação axios está enviando, ele não atinge o tempo limite:

const request = require('request');
const axios = require('axios');
const url = 'http://www.bestbuy.com/';
request({
  url: url,
  timeout: 5000,
  headers: {
    "Accept": "application/json, text/plain, */*",
    "User-Agent": "axios/0.18.0"
  }
}, (error, response, body) => {
  if (!error)
    console.log(`request got ${response.statusCode}`);
  else
    console.error(`request got an error`, error);
});

axios.get(url).then((ret) => {
  console.log(`Axios got ${ret.status}`);
});

Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.

Esta página foi útil?
0 / 5 - 0 avaliações