我如何指定自己的Phoenix Channel JSON序列化程序?

问题描述 投票:0回答:2

在我的端点中,我看起来像:

  socket "/socket", MarsWeb.UserSocket,
    websocket: [transport: Phoenix.Transports.WebSocket, serializer: {MarsWeb.JsonCamelSerializer, "~>2.0"}],

我正在尝试用自己的JSON序列化程序(对传出消息中的驼峰编码进行编码)。

我知道此语法不正确;它应该看起来如何?

更新:

因此,出于测试目的,我将其设置如下:

  socket "/socket", MarsWeb.UserSocket,
       websocket: [transport: Phoenix.Transports.Websocket, serializer: 
       Phoenix.Socket.V2.JSONSerializer]

但是它实际上不起作用:

** (FunctionClauseError) no function clause matching in Phoenix.Socket.negotiate_serializer/2
    (phoenix 1.4.15) lib/phoenix/socket.ex:613: Phoenix.Socket.negotiate_serializer(Phoenix.Socket.V2.JSONSerializer, "2.0.0")

我认为这是一个额外的版本号问题,从源头看,它似乎需要一个元组...

elixir phoenix-framework phoenix-channels
2个回答
0
投票

Phoenix.Endpoint.socket/3的文档中,我们可以看到:

Phoenix.Endpoint.socket/3-控制websocket配置。默认为:websocket。可能是true选项的关键字列表。有关整个列表,请参见“共享配置”和“ WebSocket配置”。

以下共享配置

false-消息的序列化器列表。有关更多信息,请参见:serializer

并且串行器应实现Phoenix.Socket,并且串行器Phoenix.Socket.Serializer函数必须返回Phoenix.Socket.Serializer。同样,decode!键需要Phoenix.Socket.Message(模块)作为值,如serializer:所示。

一个人不能在代码中强制执行版本,将采用可用的模块。

也就是说,如果atom实现here行为,那么下面的方法会起作用。

MarsWeb.JsonCamelSerializer

0
投票

最后,您需要粘贴一个元组列表。

我的解决方法是:

Phoenix.Socket.Serializer
© www.soinside.com 2019 - 2024. All rights reserved.