Estou tentando definir um tempo limite em um cliente HTTP que usa http.request sem sorte. Até agora, o que fiz foi o seguinte:
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
}
/* This does not work TOO MUCH... sometimes the socket is not ready (undefined) expecially on rapid sequences of requests */
req.socket.setTimeout(myTimeout);
req.socket.on('timeout', function() {
req.abort();
});
req.write('something');
req.end();
Alguma dica?
Respostas:
Só para esclarecer a resposta acima :
Agora é possível usar a
timeout
opção e o evento de solicitação correspondente:fonte
setTimeout(req.abort.bind(req), 3000);
connect
tempo limite, uma vez que o soquete é estabelecido, ele não tem efeito. Portanto, isso não vai ajudar com um servidor que mantém o soquete aberto por muito tempo (você ainda precisará fazer o seu próprio com setTimeout).timeout : A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.
request.destroy
(abort
está obsoleta.) Além disso, isso é diferente desetTimeout
Atualização de 2019
Existem várias maneiras de lidar com isso de forma mais elegante agora. Por favor, veja algumas outras respostas neste tópico. A tecnologia avança rapidamente, então as respostas podem ficar desatualizadas com bastante rapidez. Minha resposta ainda funcionará, mas também vale a pena procurar alternativas.
Resposta de 2012
Usando seu código, o problema é que você não esperou que um soquete fosse atribuído à solicitação antes de tentar definir coisas no objeto de soquete. É tudo assíncrono, então:
O evento 'socket' é disparado quando o pedido é atribuído a um objeto socket.
fonte
req.abort()
não parece ser uma funcionalidade padrão no momento. Portanto, emsocket.on
você pode querer definir uma variável comotimeout = true
e, em seguida, manipular o tempo limite apropriadamente no manipulador de respostaNo momento, existe um método para fazer isso diretamente no objeto de solicitação:
Este é um método de atalho que se liga ao evento de soquete e, em seguida, cria o tempo limite.
Referência: Manual e documentação do Node.js v0.8.8
fonte
O anwser Rob Evans funciona corretamente para mim, mas quando eu uso request.abort (), ocorre um erro de desligamento de soquete que permanece sem tratamento.
Tive que adicionar um manipulador de erros para o objeto de solicitação:
fonte
myTimeout
função? (editar: os documentos dizem: O mesmo que vincular ao evento de tempo limite nodejs.org/api/… )ECONNRESET
pode acontecer em ambos os casos: o cliente fecha o soquete e o servidor fecha a conexão. Para determinar se foi feito pelo cliente ligando,abort()
há umabort
evento especialExiste um método mais simples.
Em vez de usar setTimeout ou trabalhar com soquete diretamente,
podemos usar 'timeout' nas 'opções' nos usos do cliente
Abaixo está o código do servidor e do cliente, em 3 partes.
Módulo e parte de opções:
Parte do servidor:
Parte do cliente:
Se você colocar todas as 3 partes acima em um arquivo, "a.js", e depois executar:
então, a saída será:
Espero que ajude.
fonte
Para mim - aqui está uma maneira menos confusa de fazer o
socket.setTimeout
fonte
Elaborando a resposta @douwe aqui é onde você colocaria um tempo limite em uma solicitação http.
this.abort () também está bom.
fonte
Você deve passar a referência para solicitar como abaixo
O evento de erro de solicitação será acionado
fonte
Curioso, o que acontece se você usar puro em
net.sockets
vez disso? Aqui está um exemplo de código que criei para fins de teste:fonte