不要誤用 with
with 身為一個多條件過濾器,許多人會像下面那樣誤用它。
with ["Bearer" <> token] <- get_req_header(conn, "authorization"),
{:ok, data} <- Authenicate.verify(token) do
%{current_user: get_user(data)}
else
%{}
end
然而正確的寫法應該是下面這樣。
with ["Bearer" <> token] <- get_req_header(conn, "authorization") do
{:ok, data} = Authenicate.verify(token)
%{current_user: get_user(data)}
else
%{}
end
其中的關鍵就在 with 會安心的吞掉錯誤,我們沒辦法判斷沒有拿到
current_user 究竟是因為沒有 token 或是 token
沒有通過驗證。第二種寫法就避開了這個問題,如果 {:ok, data}
比對失敗也會留下顯眼的紀錄,並且自動從錯誤中恢復。