REST API настраиваемой обработки MatchError элегантно - PullRequest
0 голосов
/ 09 ноября 2019

Я работаю над REST API в Elixir. Я пытаюсь разработать систему, которая позволяет мне не соответствовать шаблону с пользовательским сообщением, которое будет возвращено клиенту. Я использую Plug.

Допустим, у меня есть конечная точка для создания пользователя в моей базе данных, и я могу сделать следующее утверждение, если произойдет сбой, если учетная запись уже существует:
0 = DbAdapter.select("SELECT * FROM users WHERE email = 'email@example.com';)

Это не работает с MatchError, и плагин возвращает универсальный Internal server error клиенту.

Что я хотел бы сделать, это определить некоторую конструкцию, подобную следующей:

0 = DbAdapter.select("...") << %{code: 1113, reason: "account already exists"}

Обычно, если утверждение 0 = DbAdapter.select("...") не выполняется, я бы хотел вернуть %{code: 1113, reason: "account already exists"} клиенту. Моя цель - очень простой синтаксис, такой как приведенный выше (может быть, перегрузка операторов или что-то в этом роде).

Насколько я понимаю, плагин обрабатывает ошибки следующим способом:

def handle_errors(conn, ree = %{kind: _kind, reason: _reason, stack: _stack}) do
    IO.inspect ree
    send_resp(conn, conn.status, "Internal error: The resource you're looking for might not exist on the server.")
end

Как получитьпользовательский кортеж ошибки при ошибке подтверждения и вернуть его клиенту в handle_errors? Есть ли чистый способ сделать это?

1 Ответ

0 голосов
/ 15 ноября 2019

handle_errors используется для обработки ошибок, которые могут произойти с вашим запросом, а не для особого вида статуса, который необходимо вернуть в зависимости от результата действия.

Вам нужно создать свое приложение либовернуть верные данные или значимый код ошибки, из которого он сгенерирует соответствующий ответ для клиента:

case DbAdapter.select("...") do
  0 -> create!
  _ -> %{code: 1113, reason: "account already exists"}
end

И где-то еще, возможно, возможно, в другом Plug:

case data do
  %{code: 1113, reason: reason} -> send_resp(conn, 418, reason)
  %{code: 200, data: data} -> send_resp(conn, 200, data)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...