Elixir: возвращать пользовательскую ошибку при инициализации websocket - PullRequest
1 голос
/ 05 июня 2019

Здравствуйте, я работаю на сервере websocket, который также должен аутентифицировать пользователя по пользователю и по токену пользователя. Но мне также нужно различать причину, по которой websocket был отключен на клиенте, и переподключаться, если ошибка была неожиданной.

defmodule MyApp.SocketHandler do
  def init(request, _state) do
    ...
    case UserAuthenticator.auth(user_id, user_token)
      {:ok, :successful_authentication} -> 
        state = %{...}
        {:cowboy_websocket, request, state}
      _ ->
        <how to implement the custom error code here and terminate connection properly>
    end
  end
end

Таким образом, вопрос заключается в том, как реализовать правильное завершение соединения через веб-сокет, и я должен сделать это в функции инициализации?

1 Ответ

1 голос
/ 05 июня 2019

Ответ состоял в том, чтобы внимательно прочитать документацию.Ну, ответ таков: функция init - это неправильное место для обработки аутентификации.Это должно быть сделано в websocket_init.

Объяснение можно найти здесь: https://ninenines.eu/docs/en/cowboy/2.6/guide/ws_handlers/

, поэтому для правильного закрытия соединения мы можем сделать:

def websocket_init(state) do
  {:reply, {:close, 1000, "reason"}, state}
end
...