2016-03-29 45 views
1

我有點新的NodeJS,和目前我用快遞和請求(https://github.com/request/request)轉發我的應用程序請求REST API服務器,如下圖所示目前我的代碼:如何更改請求的NodeJS響應流

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api')).pipe(res); 
}); 

此代碼在REST API服務器正常工作時起作用,但如果其餘api服務器發生故障,我的nodejs應用程序也會關閉,因爲請求流將失敗並且錯誤不會被我的應用程序捕獲。 我查請求GitHub的頁面,它提供了處理流錯誤的一種方式,像

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     console.log(err); 
    })).pipe(res); 
}); 

這隻能記錄錯誤和防止我的NodeJS應用程序崩潰,但我想改變的響應時發生錯誤,以便爲改變反應可通過管道輸送到最後一個,例如,我想在僞做什麼:

app.use('/rest/*', function(req, res) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     console.log(err); 
     // what I want to do in pseudocode 
     response.statusCode = 500; 
     response.json = { 
      reason: err.errno 
     }; 
    })).pipe(res); 
}); 

有沒有解決我的問題的任何方式?感謝您的任何想法!

+1

這也許是不可能的,只有一個請求,因爲頭部已經被錯誤是可能發生的時間發送。相反,你應該做的是從節點服務器向api服務器發出一個HEAD請求,以檢查它是否在線,然後如果出現這種情況,請將API請求傳送給客戶端。否則,你可以發送你想要的任何響應給客戶端。 –

回答

0

未經測試,但您是否可以將錯誤傳遞迴中間件來處理響應?

app.use('/rest/*', function(req, res, next) { 
    req.pipe(request('http://ipaddress/api').on('error', function(err) { 
     return next(err) 
    })).pipe(res); 
}); 

處理好,像這樣

// Exception handling 
app.use(function (error, req, res, next) { 
    console.log(error); 
    res.status(500).send(JSON.stringify(error));  
    next(); 
}); 
+0

非常感謝,它的作品!我唯一的問題是在異常處理方法中使用next()方法,我試圖刪除next()方法調用,它也可以。你能告訴我爲什麼next()在這裏使用? – Bill

+0

如果您需要執行更多(中間件)操作,則只能在異常處理中真正使用 - 例如,您可能具有日誌記錄功能 – ossie

+0

非常感謝! – Bill