在上次介紹了一些我們在處理 Error 需要的重要 function,接著我會在下個篇章介紹在處理 Error 時的先備知識以及需要考量的問題。
在介紹這些問題之前,今天我們會先稍微複習一下 HTTP StatusCode 以及處理相關 Error 需要注意的問題:
HTTP StatusCode (HTTP 狀態碼) 表明一個 HTTP 要求是否已經被完成的狀態回應分為五種:
資訊回應 (Information responses)
範圍: 100 ~ 199
舉一些 1xx status code 的例子:
成功回應 (Successful responses)
範圍: 200 ~ 299
舉一些 2xx status code 的例子:
重定向 (Redirects)
範圍: 300 ~ 399
舉一些 3xx status code 的例子:
用戶端錯誤 ( Client Errors )
範圍: 400 ~ 499
舉一些 4xx status code 的例子:
伺服器端錯誤 ( Server Errors )
範圍: 500 ~ 599
舉一些 5xx status code 的例子:
500 : 伺服器端發生未知或無法處理的錯誤
502 : 無效的閘道 - 作為閘道的 Server 在獲取處理請求所需的回應時,得到無效回應
503 : 無效的服務 - 伺服器尚未準備好處理請求。(ex. 伺服器因維護而停機或過載。)
504 : 閘道逾時 - 作為閘道的 Server 無法及時得到回應
我們真的有需要拋出這個 Error 對應這個 StatusCode 嗎 ?
這句話是什麼意思呢?
在 Error 處裡的時候,我們通常會去定義一個錯誤以及他對應的 StatusCode。
舉個例子,在 getPost 中, Client 在 嘗試取得一個不存在的 post ID 對應的 post,那麼這時候我們會處理這個情形並拋出 404 的 StatusCode ,如以下範例:
export.getPost = catchAsyncError(async (req, res, next) => {
const post = await Post.findById(req.params.id);
if(!post) {
next(new AppError('No post found with that ID', 404));
}
});
但我們真的需要在所有地方都處理 404 嗎?
假設我們今天想要取得所有的 post,在 getAllPosts 中,我們或許就不需要在沒有取得 post 的情況下,還拋出例外回傳 404。
因為 getAllPost 還是可以存在空值,若沒有資料就表示 DB 中沒有任何的 post,他確實也完成了搜尋的工作,所以回傳空也可以,故我們只需要回傳 200,其他錯誤交給 catchAsyncError~
請看以下範例:
export.getAllPosts = catchAsyncError(async (req, res, next) => {
// 以上省略獲取資料的程式碼,假設我們拿到 posts
const posts = await features.query;
// 注意! 我們不會特別加入以下程式碼處理空值
//
// if(!posts) {
// next(new AppError('No post found with that ID', 404));
// }
// 返回 response
res.status(200).json({
status: 'success',
results: posts.length,
data: {
posts
}
});
});
今天稍微複習了一下 StatusCode,順便看了一下有關哪些情況要怎麼使用 status code 的範例介紹,覺得滿有趣的 ~
Udemy Node.js, Express, MongoDB & More: The Complete Bootcamp 2023
https://www.udemy.com/course/nodejs-express-mongodb-bootcamp/learn/lecture/15065212#overview
Status Code
https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Status