2013-11-25 5 views
20

Я написал простой прокси на nodejs и это выглядит какОшибки по запросу трубопроводу

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

Он отлично работает, если удаленный хост доступен, но если удаленный хост недоступен весь сбой сервера узла с необработанным исключением

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) 

Как я могу обращаться с такими ошибками?

+0

[Лучшие ответы здесь] (http://stackoverflow.com/questions/7222982/node-request-how-to-determine-if-an-error-occurred-during-the-request) – laggingreflex

ответ

28

Глядя на документы (https://github.com/mikeal/request), вы должны быть в состоянии сделать что-то по следующим направлениям:

Вы можете использовать дополнительный аргумент обратного вызова по запросу, например:

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

Кроме того, вы может поймать неперехваченное исключение, с чем-то вроде следующего:

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

Спасибо, это работает на меня. – ioncreature

2

Если вы поймаете неперехваченное исключение для ECONNREFUSED make обязательно перезапустите свой процесс. Я видел в тестировании, что сокет становится нестабильным, если вы игнорируете исключение и просто пытаетесь повторно подключиться.

Вот отличный обзор: http://shapeshed.com/uncaught-exceptions-in-node/

Я закончил с использованием «навсегда» инструмента, чтобы перезапустить процесс моего узла, с помощью следующего кода:

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

Вы должны действительно попытаться предотвратить ECONNREFUSED исключения от превращения в непроверенные:

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

Если вы получаете фактическое неперехваченное исключение, то вы должны просто позволить программе умереть.

Смежные вопросы