2013-11-25 11 views
20

Napisałem prosty proxy na nodejs i wyglądaObsługa błędów na rurociągu żądanie

var request = require('request'); 
app.all('/proxy/*', function(req, res){ 
    req.pipe(request({ 
     url: config.backendUrl + req.params[0], 
     qs: req.query, 
     method: req.method 
    })).pipe(res); 
}); 

To działa dobrze, jeśli zdalny host jest dostępny, ale jeśli zdalny host jest niedostępny całe awarii serwera węzeł z nieobsługiwany wyjątek

stream.js:94            
     throw er; // Unhandled stream error in pipe.   
      ^            
Error: connect ECONNREFUSED         
    at errnoException (net.js:901:11)      
    at Object.afterConnect [as oncomplete] (net.js:892:19) 

Jak mogę obsłużyć takie błędy?

+0

[Lepsze odpowiedzi tutaj] (http://stackoverflow.com/questions/7222982/node-request-how-to-determine-if-an-error-occurred-during-request) – laggingreflex

Odpowiedz

28

Patrząc na docs (https://github.com/mikeal/request) powinien być w stanie coś zrobić wzdłuż następujących linii:

Można użyć opcjonalnego argumentu wywołania zwrotnego na żądanie, na przykład:

app.all('/proxy/*', function(req, res){ 
    req.pipe(request({ 
     url: config.backendUrl + req.params[0], 
     qs: req.query, 
     method: req.method 
    }, function(error, response, body){ 
    if (error.code === 'ECONNREFUSED'){ 
     console.error('Refused connection'); 
    } else { 
     throw error; 
    } 
    })).pipe(res); 
}); 

Alternatywnie, ty można złapać nieprzechwyconego wyjątku, z czymś, co następuje:

process.on('uncaughtException', function(err){ 
    console.error('uncaughtException: ' + err.message); 
    console.error(err.stack); 
    process.exit(1);    // exit with error 
}); 
+0

Dziękuję, to pracuje dla mnie. – ioncreature

2

Jeśli złapać przechwycony wyjątek dla ECONNREFUSED marki upewnij się, że uruchomiłeś ponownie swój proces. Podczas testowania zobaczyłem, że gniazdo staje się niestabilne, jeśli zignorujesz wyjątek i po prostu spróbujesz ponownie się połączyć.

Oto wielki przegląd: http://shapeshed.com/uncaught-exceptions-in-node/

skończyło się za pomocą narzędzia „na zawsze”, aby ponownie uruchomić proces węzła, z następującego kodu:

process.on('uncaughtException', function(err){ 
//Is this our connection refused exception? 
    if(err.message.indexOf("ECONNREFUSED") > -1) 
    { 
    //Safer to shut down instead of ignoring 
    //See: http://shapeshed.com/uncaught-exceptions-in-node/ 
    console.error("Waiting for CLI connection to come up. Restarting in 2 second..."); 
    setTimeout(shutdownProcess, 2000); 
    } 
    else 
    { 
    //This is some other exception.. 
    console.error('uncaughtException: ' + err.message); 
    console.error(err.stack); 
    shutdownProcess(); 
    } 
}); 

//Desc: Restarts the process. Since forever is managing this process it's safe to shut down 
//  it will be restarted. If we ignore exceptions it could lead to unstable behavior. 
//  Exit and let the forever utility restart everything 
function shutdownProcess() 
{ 
    process.exit(1); //exit with error 
} 
2

Trzeba rzeczywiście starają się zapobiec ECONNREFUSED wyjątek z coraz nieprzechwycony:

var request = require('request'); 
app.all('/proxy/*', function(req, res){ 
    req.pipe(request({ 
     url: config.backendUrl + req.params[0], 
     qs: req.query, 
     method: req.method 
    })) 
    .on('error', err => { 
     const msg = 'Error on connecting to the webservice.'; 
     console.error(msg, err); 
     res.status(500).send(msg); 
    }) 
    .pipe(res); 
}); 

Jeśli masz rzeczywisty wyjątek nieprzechwycony, to należy po prostu pozwól umrzeć aplikacji.