Elixir:return websocket init 上的自定义错误

Elixir: return custom error on websocket init

您好,我正在开发 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

所以问题是如何正确终止 websocket 连接,我应该在 init 函数中这样做吗?

答案是仔细阅读文档。那么答案是: 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