2016-09-30 57 views
2

我使用NPM請求模塊轉發傳入的請求到另一臺服務器爲:投產ECONNREFUSED錯誤不是由錯誤事件處理,並嘗試捕捉

app.get("/somepath", function(req, res) { 
    var url = proxySetting.global.url + req.url; 
    req.pipe(request(url)).pipe(res); 
}); 

這裏:proxySetting.global.url == http://localhost:4000

現在當我將這樣的傳入請求轉發到目標服務器時,如果目標服務器(localhost:4000)關閉或請求在目標服務器上被掛起。

會出現ECONNREFUSED或掛斷錯誤等錯誤。

試圖捕捉使用域模塊這些錯誤,如下面

var d = domain.create(); 
d.on("error", function(err) { 
    console.log("Error occoured while forwarding request"); 
    console.log(err); 
    res.status(500).send("Error occoured while forwarding request"); 
}); 
d.run(function() { 
    req.pipe(request(url)).pipe(res); 
}); 

試圖抓住錯誤事件中的幾個組合

var request = require("request"); 

module.exports = function(proxySetting) { 
    return function(req, res, next) { 
     var url = proxySetting.global.url + req.url; 
     url = url.replace(/([^:]\/)\/+/g, "$1") // replacing multiple slashes with one 
     console.log("Forwarding request to: " + url); 

     function errorHandler(err) { 
      console.log("Error occoured while forwarding request"); 
      console.log(err); 
      res.status(500).send("Error occoured while forwarding request"); 
     } 
     req.on("error", errorHandler); 
     res.on("error", errorHandler); 
     req.pipe(request(url).on("error",errorHandler)).pipe(res); 
    }; 
}; 

,但仍引發異常的進程和服務器崩潰 的一種方式我現在正在做的是

process.on('uncaughtException', function(err) { 
    console.log("Some unhandled error occoured"); 
    console.log(err); 
    console.log("Stopping server"); 
    process.exit(1); 
}); 

但我認爲抓住uncaughtException和處理不是一個合適的解決方案

+0

我不知道nodeJS錯誤處理,但請看看這個,http://stackoverflow.com/questions/25846475/node-js-handling-tcp-socket-error-econnrefused。你在找這個嗎? –

+0

這是問題的部分解決方案,按照他們要求檢查連接並將請求轉發到遠程服務器的解決方案。但是當遠程服務器啓動但是請求掛在遠程服務器上時會出現另一種情況,並且我們將得到一個掛起錯誤,它將終止代理服務器進程。 –

回答

1

看來,你不是在"errorHandler"響應對象的行爲,如果你看到你的代碼塊(下面給出),res超出範圍。

function errorHandler(err) { 
    console.log("Error occoured while forwarding request"); 
    console.log(err); 
    res.status(500).send("Error occoured while forwarding request"); 
} 
req.on("error", errorHandler); 
res.on("error", errorHandler); 
req.pipe(request(url).on("error", errorHandler)) .pipe(res); 

但是,如果你在錯誤處理行爲響應對象,也不會有任何uncaughtException

我已經創建了一個解決方案,如果代理服務器關閉,它將作用於錯誤句柄上的響應對象,因此它不會碰到uncaughtException事件。

以下是解決方案。

var response ; 

app.get('/', function(req, res){ 
    var url = "http://localhost:3001" + req.url; 
    response = res; // I am setting res to global variable here 
    req.pipe(request(url).on("error",errorHandler)).pipe(res); 

}); 


function errorHandler(err) { 
    response.status(500).send("Error occoured while forwarding request"); 
} 

process.on('uncaughtException', function(err) { 
    console.log("Some unhandled error occoured"); 
    console.log(err); 
    console.log("Stopping server"); 
    process.exit(1); 
}); 

這裏uncaughtException事件將不會被調用,我已經解決了回購檢查,你可以試試看。回購地點 - here

使用「Run1.sh」作爲成功案例,代理服務器停止使用「Run2.sh」。

+0

你好Arvind,問題是不相關的res是超出範圍,實際代碼更新問題 –

+0

我試過相同的更新代碼,它現在正在工作,不知道如何,我更新了請求包可能是由於需要調查。 –

+0

@MayankKansal你可以用你的請求包版本更新我,這樣我就可以重現同樣的內容。 –