2012-10-09 24 views
10

Este es el código que he utilizado para descargar imágenes desde URL:Incluyendo tiempo de espera en Node.js http.get al obtener gran número de descargas de imágenes

http.get(options, function (res) { 
    res.on('data', function (data) { 
     file.write(data); 
    }).on('end', function() { 
     file.end(); 
     console.log(file_name + ' downloaded '); 
     cb(null, file.path); 
    }).on('error', function (err) { 
     console.log("Got error: " + err.message); 
     cb(err, null); 
    }); 
}); 

¿Cómo puedo agregar un tiempo de espera para cada solicitud para que no se quede esperando una respuesta que sea de gran tamaño o que no responda?

+2

Suena como un buen plan. ¿Qué has intentado? – lanzz

+1

Use esto: http://nodejs.org/api/http.html#http_request_settimeout_timeout_callback – freakish

+0

¿Pero cómo debo usar el objeto de respuesta aquí? – user1386776

Respuesta

29

OK, hay al menos dos soluciones a su problema. Uno fácil:

var request = http.get(options, function (res) { 
    // other code goes here 
}); 
request.setTimeout(10000, function() { 
    // handle timeout here 
}); 

pero puede que no sea lo suficientemente flexible. El más avanzado:

var timeout_wrapper = function(req) { 
    return function() { 
     // do some logging, cleaning, etc. depending on req 
     req.abort(); 
    }; 
}; 

var request = http.get(options, function (res) { 
    res.on('data', function (data) { 
     file.write(data); 
     // reset timeout 
     clearTimeout(timeout); 
     timeout = setTimeout(fn, 10000); 
    }).on('end', function() { 
     // clear timeout 
     clearTimeout(timeout); 
     file.end(); 
     console.log(file_name + ' downloaded '); 
     cb(null, file.path); 
    }).on('error', function (err) { 
     // clear timeout 
     clearTimeout(timeout); 
     console.log("Got error: " + err.message); 
     cb(err, null); 
    }); 
}); 

// generate timeout handler 
var fn = timeout_wrapper(request); 

// set initial timeout 
var timeout = setTimeout(fn, 10000); 
+0

Tiene un error en la versión avanzada del código: la configuración del tiempo de espera inicial 'var timeout = setTimeout (fn, 10000);' debe estar fuera de la devolución de llamada 'http.get'. – zavg

+0

@zavg Tienes razón, arreglado. – freakish

+6

¿Cuáles son las limitaciones del primer método? – Robotbugs

Cuestiones relacionadas