2011-12-05 10 views
16

Sto cercando di rilevare errori ECONNREFUSED quando si utilizza un client HTTP in node.js. Sto facendo domande come questa:Catching ECONNREFUSED in node.js con http.request?

var http = require('http'); 
var options = { host: 'localhost', port: '3301', path: '/', method: 'GET' }; 

http.request(options).on('response', function (res) { 
    // do some stuff 
}); 

io non riesco a capire come prendere questo errore:

Error: connect ECONNREFUSED 
    at errnoException (net.js:614:11) 
    at Object.afterConnect [as oncomplete] (net.js:605:18) 

Se lo faccio request.on('error', function() {});, essa non prenderlo. Se lo faccio in questo modo:

var req = request.on(etc) 
req.on('error', function blah() {}); 

allora ottengo TypeError: Object false has no method 'on'.

Devo davvero fare un errore di livello superiore non rilevato per gestire questo problema? Al momento qualunque cosa faccia, il mio intero processo si interrompe.

Edit: ho trovato alcuni post del blog su come farlo creando un oggetto connection, chiamando request su questo, e quindi vincolante per gli errori sull'oggetto connection, ma non che rendono l'intero http.request() scorciatoia inutile?

+2

L'ho capito. È perché stavo facendo questo: var req = http.richiesta (opzioni) .on ('response', function (res) { // fare alcune cose }). end(); req.on ('error', handleError); Stavo chiamando il req.on dopo aver chiamato end(). Facepalm! – Cera

+0

Per le viste future, si sarebbe in grado di pubblicare un collegamento a quel post del blog? Penso che sarebbe molto utile avere qui. – CSilivestru

risposta

17

Qualche ragione per cui non usi la http://nodejs.org/docs/v0.6.5/api/http.html#http.request come base? Prova questo:

var req = http.request(options, function(res) { 
    // Bind 'data', 'end' events here 
}); 

req.on('error', function(error) { 
    // Error handling here 
}); 

req.end(); 
+0

non funziona

var req = http.request("http://www.google.com/index.html", function(res) { console.log("Got response: " + res.statusCode); // Bind 'data', 'end' events here }); req.on('error', function(error) { console.log(error) // Error handling here }); req.end();
Codefor

+0

Hai provato con un oggetto opzioni valido invece di passare un url come primo parametro? –

+1

L'utilizzo del nodo 10 e I può confermare che questa soluzione funziona gestendo l'errore ECONNREFUSE. – Nucleon

2

Ogni chiamata a http.request() restituisce la sua auto. in modo da provare in questo modo ...

http.request(options.function(){}).on('error',function(){}).end(); 
+0

Soluzione semplice! Grazie! –

2

Ho una soluzione per questo, dopo aver provato tutti i suggerimenti su questo (e molti altri) pagine.

Il mio client deve rilevare un prodotto chiavi in ​​mano che esegue finestre incorporate. Il client viene servito da una macchina diversa a quella chiavi in ​​mano.

Il chiavi in ​​mano può essere in 3 stati:

  1. spenta
  2. avvio in Windows, ma non è in esecuzione l'applicazione chiavi in ​​mano
  3. in esecuzione l'applicazione chiavi in ​​mano

mio client invia un 'trova il prodotto chiavi in ​​mano' GET messaggio al mio servizio nodejs/express, che quindi cerca di trovare il prodotto chiavi in ​​mano tramite http.request. Il comportamento per ciascuno dei 3 casi d'uso è;

  1. timeout
  2. ECONNREFUSED - perché le finestre di fase incorporato del chiavi in ​​mano è connessioni rifiutano.
  3. normale risposta alla richiesta (scenario giorno felice)

Il codice qui sotto gestisce tutti i 3 scenari. Il trucco per catturare l'evento ECONNREFUSED stava imparando che il suo gestore si lega all'evento socket.

var http = require('http'); 
var express = require('express'); 
var url = require('url'); 


function find (req, res) { 
    var queryObj = url.parse(req.url, true).query; 

    var options = { 
     host: queryObj.ip, // client attaches ip address of turnkey to url. 
     port: 1234, 
     path: '/some/path', 
    }; // http get options 

    var badNews = function (e) { 
     console.log (e.name + ' error: ', e.message); 
     res.send({'ok': false, 'msg': e.message}); 
    }; // sends failure messages to log and client 

    // instantiate http request object and fire it 
    var msg = http.request(options, function (response) { 
     var body = ''; 

     response.on ('data', function(d) { 
      body += d; 
     }); // accumulate response chunks 

     response.on ('end', function() { 
      res.send({'ok': true, 'msg': body}); 
      console.log('sent ok'); 
     }); // done receiving, send reply to client 

     response.on('error', function (e) { 
      badNews(e); 
     }); // uh oh, send bad news to client 
    }); 

    msg.on('socket', function(socket) { 
     socket.setTimeout(2000, function() { // set short timeout so discovery fails fast 
      var e = new Error ('Timeout connecting to ' + queryObj.ip)); 
      e.name = 'Timeout'; 
      badNews(e); 
      msg.abort(); // kill socket 
     }); 
     socket.on('error', function (err) { // this catches ECONNREFUSED events 
      badNews(err); 
      msg.abort(); // kill socket 
     }); 
    }); // handle connection events and errors 

    msg.on('error', function (e) { // happens when we abort 
     console.log(e); 
    }); 

    msg.end(); 
} 
Problemi correlati