UP | HOME

不要誤用 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} 比對失敗也會留下顯眼的紀錄,並且自動從錯誤中恢復。

Date: 2021-07-17 Sat 00:00
Author: Lîm Tsú-thuàn