운없이 http.request를 사용하는 HTTP 클라이언트에서 시간 제한을 설정하려고합니다. 지금까지 내가 한 일은 다음과 같습니다.
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();
힌트가 있습니까?
답변
이제 timeout
옵션 및 해당 요청 이벤트 를 사용할 수 있습니다.
// set the desired timeout in options
const options = {
//...
timeout: 3000,
};
// create a request
const request = http.request(options, response => {
// your callback here
});
// use its "timeout" event to abort the request
request.on('timeout', () => {
request.abort();
});
답변
2019 업데이트
이제 이것을보다 우아하게 처리 할 수있는 다양한 방법이 있습니다. 이 스레드에서 다른 답변을 참조하십시오. 기술은 빠르게 움직이므로 답변은 종종 상당히 빨리 구식이 될 수 있습니다. 내 대답은 여전히 작동하지만 대안도 살펴볼 가치가 있습니다.
2012 년 답변
코드를 사용할 때 문제는 소켓 객체에 항목을 설정하기 전에 요청에 소켓이 할당 될 때까지 기다리지 않았다는 것입니다. 모두 비동기이므로 :
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
});
req.on('socket', function (socket) {
socket.setTimeout(myTimeout);
socket.on('timeout', function() {
req.abort();
});
});
req.on('error', function(err) {
if (err.code === "ECONNRESET") {
console.log("Timeout occurs");
//specific error treatment
}
//other error treatment
});
req.write('something');
req.end();
요청에 소켓 개체가 할당되면 ‘socket’이벤트가 시작됩니다.
답변
현재 요청 객체에 대해 직접이 작업을 수행하는 방법이 있습니다.
request.setTimeout(timeout, function() {
request.abort();
});
이것은 소켓 이벤트에 바인딩 한 다음 타임 아웃을 생성하는 바로 가기 메서드입니다.
답변
Rob Evans anwser는 나를 위해 올바르게 작동하지만 request.abort ()를 사용하면 처리되지 않은 소켓 중단 오류가 발생합니다.
요청 개체에 대한 오류 처리기를 추가해야했습니다.
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
}
req.on('socket', function (socket) {
socket.setTimeout(myTimeout);
socket.on('timeout', function() {
req.abort();
});
}
req.on('error', function(err) {
if (err.code === "ECONNRESET") {
console.log("Timeout occurs");
//specific error treatment
}
//other error treatment
});
req.write('something');
req.end();
답변
더 간단한 방법이 있습니다.
setTimeout을 사용하거나 소켓으로 직접 작업하는 대신
클라이언트 사용의 ‘options’에서 ‘timeout’을 사용할 수 있습니다.
아래는 서버와 클라이언트의 코드입니다.
모듈 및 옵션 부분 :
'use strict';
// Source: https://github.com/nodejs/node/blob/master/test/parallel/test-http-client-timeout-option.js
const assert = require('assert');
const http = require('http');
const options = {
host: '127.0.0.1', // server uses this
port: 3000, // server uses this
method: 'GET', // client uses this
path: '/', // client uses this
timeout: 2000 // client uses this, timesout in 2 seconds if server does not respond in time
};
서버 부분 :
function startServer() {
console.log('startServer');
const server = http.createServer();
server
.listen(options.port, options.host, function () {
console.log('Server listening on http://' + options.host + ':' + options.port);
console.log('');
// server is listening now
// so, let's start the client
startClient();
});
}
클라이언트 부분 :
function startClient() {
console.log('startClient');
const req = http.request(options);
req.on('close', function () {
console.log("got closed!");
});
req.on('timeout', function () {
console.log("timeout! " + (options.timeout / 1000) + " seconds expired");
// Source: https://github.com/nodejs/node/blob/master/test/parallel/test-http-client-timeout-option.js#L27
req.destroy();
});
req.on('error', function (e) {
// Source: https://github.com/nodejs/node/blob/master/lib/_http_outgoing.js#L248
if (req.connection.destroyed) {
console.log("got error, req.destroy() was called!");
return;
}
console.log("got error! ", e);
});
// Finish sending the request
req.end();
}
startServer();
위의 세 부분을 모두 “a.js”파일에 넣고 다음을 실행하면 :
node a.js
그러면 출력은 다음과 같습니다.
startServer
Server listening on http://127.0.0.1:3000
startClient
timeout! 2 seconds expired
got closed!
got error, req.destroy() was called!
도움이되기를 바랍니다.
답변
나를 위해-여기에 덜 혼란스러운 방법이 있습니다. socket.setTimeout
var request=require('https').get(
url
,function(response){
var r='';
response.on('data',function(chunk){
r+=chunk;
});
response.on('end',function(){
console.dir(r); //end up here if everything is good!
});
}).on('error',function(e){
console.dir(e.message); //end up here if the result returns an error
});
request.on('error',function(e){
console.dir(e); //end up here if a timeout
});
request.on('socket',function(socket){
socket.setTimeout(1000,function(){
request.abort(); //causes error event ↑
});
});
답변
@douwe에 대한 답변을 자세히 설명하면 http 요청에 시간 제한을 두는 곳입니다.
// TYPICAL REQUEST
var req = https.get(http_options, function (res) {
var data = '';
res.on('data', function (chunk) { data += chunk; });
res.on('end', function () {
if (res.statusCode === 200) { /* do stuff with your data */}
else { /* Do other codes */}
});
});
req.on('error', function (err) { /* More serious connection problems. */ });
// TIMEOUT PART
req.setTimeout(1000, function() {
console.log("Server connection timeout (after 1 second)");
req.abort();
});
this.abort ()도 좋습니다.