node.js distinguiendo errores al hacer una solicitud http

Mi aplicación node.js usa http.request para la API REST http://army.gov/launch-nukes y necesito distinguir tres casos posibles:

  • Success – El servidor responde de forma afirmativa. Sé que mis enemigos son destruidos.
  • Error: O he recibido un error del servidor o no he podido conectarme al servidor . Todavía tengo enemigos.
  • Unknown : después de establecer una conexión con el servidor , envié la solicitud, pero no estoy seguro de qué sucedió. Esto podría significar que la solicitud nunca llegó al servidor, o que la respuesta del servidor a mí nunca lo hizo. Puede o no haber empezado una guerra mundial.

Como puede ver, es muy importante para mí distinguir el caso de Failure y Unknown , ya que tienen consecuencias muy diferentes y acciones diferentes que debo tomar.

También me gustaría mucho usar http Keep-Alive, como puedo decir, soy un poco traficante de la guerra y planeo hacer muchas solicitudes en ráfagas (y luego nada durante largos períodos de tiempo)

El núcleo de la pregunta es cómo separar un error de conexión / tiempo de espera (que es un Failure ) de un error / tiempo de espera que se produce después de que la solicitud se ponga en el cable (que es un Unknown ).

En la lógica de código puedo quiero esto:

 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 */); } ) 

Aquí hay un ejemplo:

 var http = require('http'); var options = { hostname: 'localhost', port: 7777, path: '/', method: 'GET' }; var req = http.request(options, function (res) { // check the returned response code if (('' + res.statusCode).match(/^2\d\d$/)) { // Request handled, happy } else if (('' + res.statusCode).match(/^5\d\d$/)) // Server error, I have no idea what happend in the backend // but server at least returned correctly (in a HTTP protocol // sense) formatted response } }); req.on('error', function (e) { // General error, ie // - ECONNRESET - server closed the socket unexpectedly // - ECONNREFUSED - server did not listen // - HPE_INVALID_VERSION // - HPE_INVALID_STATUS // - ... (other HPE_* codes) - server returned garbage console.log(e); }); req.on('timeout', function () { // Timeout happend. Server received request, but not handled it // (ie doesn't send any response or it took to long). // You don't know what happend. // It will emit 'error' message as well (with ECONNRESET code). console.log('timeout'); req.abort(); }); req.setTimeout(5000); req.end(); 

Te recomiendo que juegues con él usando netcat, ej .:

 $ nc -l 7777 // Just listens and does not send any response (ie timeout) $ echo -e "HTTP/1.1 200 OK\n\n" | nc -l 7777 // HTTP 200 OK $ echo -e "HTTP/1.1 500 Internal\n\n" | nc -l 7777 // HTTP 500 

(y así…)

Esto suele estar en el código de estado de las API. En el paquete de solicitud puedes acceder a él de esta manera.

 request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // Print the google web page. } }) 

response.statusCode siendo 200 significa que funcionó. 500 sería el fracaso. Desconocido sería el callback que nunca se llamaba.

Si la API que está describiendo no sigue los códigos de respuesta estándar, no lo sé. Tendrás que mirar los documentos.

Intereting Posts