2013-11-25 38 views
20

tôi đã viết Proxy đơn giản trên nodejs và có vẻ nhưLỗi theo yêu cầu ống

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

Nó hoạt động tốt nếu máy chủ từ xa có sẵn, nhưng nếu máy chủ từ xa không có sẵn server nút toàn bộ tai nạn với ngoại lệ unhandled

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) 

Tôi làm cách nào để xử lý các lỗi như vậy?

+0

[Câu trả lời hay hơn tại đây] (http://stackoverflow.com/questions/7222982/node-request-how-to-determine-if-an-error-occurred-during-the-request) – laggingreflex

Trả lời

28

Nhìn vào các tài liệu (https://github.com/mikeal/request), bạn sẽ có thể làm điều gì đó dọc theo dòng sau đây:

Bạn có thể sử dụng đối số tùy chọn gọi lại theo yêu cầu, ví dụ:

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

Ngoài ra, bạn có thể bắt được một ngoại lệ không bị bắt, với một cái gì đó như sau:

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

Cảm ơn bạn, nó làm việc cho tôi. – ioncreature

2

Nếu bạn nắm bắt ngoại lệ chưa được thực hiện cho ECONNREFUSED chắc chắn để khởi động lại quá trình của bạn. Tôi thấy trong thử nghiệm rằng ổ cắm trở nên không ổn định nếu bạn bỏ qua ngoại lệ và chỉ cần cố gắng kết nối lại.

Dưới đây là một tổng quan tuyệt vời: http://shapeshed.com/uncaught-exceptions-in-node/

tôi đã kết thúc bằng cách sử dụng "mãi mãi" công cụ để khởi động lại quá trình nút của tôi, với đoạn mã sau:

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

Bạn thực sự nên cố gắng ngăn chặn sự ngoại lệ ECONNREFUSED từ trở nên bị bắt:

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

Nếu bạn nhận được ngoại lệ chưa thực sự, thì bạn chỉ nên để ứng dụng chết.