我有3個具有API介面的微服務,目標是在我的系統中創建一個新用戶。
- service1 --> 是主服務,并將與其他服務一起協調請求
- service2 --> 將在Firebase中創建用戶
- service2 --> 將在Firebase中創建用戶 。
- service3 --> 將在資料庫中創建用戶 。
前端將呼叫服務1,它將首先呼叫服務2,然后呼叫服務3。有了這個結果,service1將對frontEnd作出回應。
如果每個服務都回應200-OK,則一切正常,問題在于錯誤處理。
當service2向service1回應401- "User already exist in system "時,我只能從錯誤中檢索到" message: 請求失敗,狀態代碼為401",而不是服務2發送的 "用戶已經存在于系統中 "的文本。
我怎樣才能讓service1通過service2發送的錯誤代碼和錯誤資訊?401- 用戶已經存在于系統中
服務1將通過服務2發送的錯誤代碼和錯誤資訊。
service1.js service2.js uj5u.com熱心網友回復: 為了回答你在主服務路由處理程式的app.post('/createAdminAgent'/span>, async (req, res) => {
let body = req.body;
try {
const response_createAgentFirebase = await axios. post(service2URL '/createAgent', req.body); //the user exist and will respond 401。
const response_createAgentBDD = await axios. post(service3URL '/createEnterpriseAndAdminAgent', req.body) 。
res.status(200).send(response_createAgentBDD.data) 。
} catch (error) {
res.status(400).send(error); //我如何在這里獲得service2發送的文本 "User already exist in system "和狀態代碼401。
}
});
app.post("/createAgent"/span>, async (req, res) => {
createAgentOnFirebase(req.body, async function(err, firebaseResult) {
if (err == null){
res.status(200).send(firebaseResult)。
}else{
res.status(401).send({
status: 401,
error: '用戶已經存在于系統中'。
})
}
})
})
try { } catch() { }塊的注釋中的問題:"我怎樣才能在這里得到service2發送的文本 "User already exist in system "和狀態代碼401"
您應該將任何錯誤傳遞給自定義錯誤處理中間件函式(您可以自己定義),并在這些函式中處理錯誤,而不是在路由處理程式本身。試圖在路由回呼本身中處理錯誤會變得很混亂,并經常導致重復的代碼。
觸發錯誤處理程式
為了觸發堆疊中的下一個明確的錯誤處理程式,你所需要做的就是將一個錯誤傳遞給作為路由處理程式回呼中最后一個引數提供的next回呼。如果你沒有安裝任何自定義的中間件,Express將使用已經包含在中間件堆疊中的默認值。
使用自定義錯誤處理程式
要使用自定義函式,你將以同樣的方式觸發它,但你必須用以下標準來自己定義該函式:
(error, req, res, next) => {}從這里,你可以從req和error物件中決議出資料,以獲得關于請求的更多資訊以及在處理程序中拋出的錯誤。更多關于這個實作的資訊見下文。
從expressjs檔案中的基本內容開始:
錯誤處理是指Express如何抓取和處理同步和異步發生的錯誤。Express自帶了一個默認的錯誤處理程式,所以你不需要撰寫自己的錯誤處理程式就可以開始使用。
看起來你主要關注的是處理異步錯誤。你可以在你的中間件堆疊的末端附加一個自定義的錯誤處理程式,它需要4個引數,像這樣:
// apiRouter將包含所有的路由。
app.use('/api/v1', apiRouter) 。
//錯誤處理程式被附在堆疊的最后,在你的路由之后。
app.use((err, req, res, next) =>/span> {
//自定義錯誤處理邏輯在此。
//確保結束連接,否則請求將掛起。
});
只要你從任何一個路由處理程式中向next函式傳遞一個錯誤,Express就會自動呼叫該中間件。
從他們的檔案中還可以注意到另一件事:
從 Express 5 開始,回傳 Promise 的路由處理程式和中間件在拒絕或拋出錯誤時將自動呼叫 next(value)。
根據你的版本,你可能會開始遇到這種行為(如果你正在回傳 Promises)。在這種情況下,對于這些 Promises,你的錯誤將由默認的 express error 中間件來處理。
如果你向 next() 傳遞了一個錯誤,并且你沒有在自定義錯誤處理程式中處理它,那么它將被內置的錯誤處理程式處理;該錯誤將與堆疊跟蹤一起寫給客戶端。堆疊跟蹤不包括在生產環境中。
默認的錯誤處理程式描述
當一個錯誤被寫入時,以下資訊將被添加到回應中:
當一個錯誤被寫入時,以下資訊將被添加到回應中:
Res.statusCode是一個錯誤,但它是一個錯誤。 res.statusCode由err.status(或err.statusCode)設定。 如果這個值在4xx或5xx范圍之外,它將被設定為500。 Res.statusMessage根據狀態代碼設定。 在生產>環境中,body將是狀態代碼訊息的HTML,否則將是err.stack. 。任何在err.headers物件中指定的頭檔案。
建議
在您的案例中,我將利用創建多個錯誤處理程式的能力,并在該鏈的末端提供一個 "捕獲"。在捕獲錯誤時,您可以添加自定義道具,向錯誤處理程式提示它們正在處理的問題。處理程式中明確的if陳述句可以檢查這些自定義道具并處理你期望看到的錯誤。未預見的錯誤將落入下一個錯誤處理程式(前提是你通過使用next將錯誤傳遞給它)。
app.use('/api/v1', apiRouter) 。
...
app.use(errorLoggingHandler)。
app.use(errorResponseHandler)。
app.use(errorCatchAllHandler)。
uj5u.com熱心網友回復:
對不起,如果我沒有正確解釋這個想法。我的目標是在錯誤發生時,將錯誤回應從service2傳遞到service1。我解決了在服務1中使用res.status(error.response.status).send(error.response.data)的catch。 謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332247.html
標籤:
上一篇:在R中以行為單位移位值
