【问题标题】:Cowboy and jiffy websocket_handle events牛仔和 jiffy websocket_handle 事件
【发布时间】:2013-06-08 02:54:05
【问题描述】:

我正在为我的 websocket 使用牛仔和 jiffy(Json 库)。我可以在我的 websocket_handle 中接收来自客户端的数据,因为现在我有类似的代码

websocket_handle({text, Msg}, Req, Handle) ->
    Message = jiffy:decode(Msg),
    case Message of  

        模式1 -> ............ 模式2-> ………… 结尾, {ok, Res, State}

但是,我想在句柄级别进行模式匹配而不是这个......

  websocket_handle({text, pattern1}, Req, State),
  websocket_handle({text, pattern2}, Req, State)

问题是我不能在 websocket_handle 的参数中使用 jiffy:decode .. 所以我不能写类似的东西

 websocket_handle({text, jiffy:decode(Msg), Req, State})

如何让它工作???

【问题讨论】:

  • 嗨阿图尔。除了以更少的行结束(如果它有效,但正如您所发现的那样),您是否还有另一个原因要在函数签名中进行解码?正如我倾向于说,稍后使用 case 表达式是一种好方法,或者在解码后,调用与 case 步骤类似的模式匹配的不同函数。
  • Hey Ward 感谢您的回复.. 我可以毫无问题地使用案例,但我想避免这种情况,原因很简单,将来可能会有很多事件,每个事件都可以返回不同的响应.. 所以我想使用函数签名将它们分开......而且我认为匹配函数签名是一种更简洁的方法:)

标签: json erlang websocket cowboy


【解决方案1】:

如果您喜欢函数签名与 case 表达式中的模式匹配,您可以将解码后的消息“转发”到另一个“内部”函数。

websocket_handle({text, Msg}, Req, Handle) ->
    Message = jiffy:decode(Msg),
    websocket_handle_({test, Message}, Req, Handle).

websocket_handle_({text, Pattern1}, Req, Handle) ->
    {ok, Req, State}; 
websocket_handle_({text, Pattern2}, Req, Handle) ->
    {reply, OutFrame | [OutFrame], Req, State};
websocket_handle_({text, PatternN}, Req, Handle) ->
    {ok, Req, State}.

【讨论】:

  • 嘿,沃德,这是一个不错的解决方案(想知道为什么它没有点击我 :))。我能想到的唯一问题是,如果很少有事件想要发送回复而很少有没有.. 很少有事件返回 {ok, Req, State} 和很少 {reply, OutFrame | [OutFrame], Req, State} 然后我将不得不在 websocket_hande 中放置条件以进行响应...
  • 谢谢沃德......我明白了,但我有点困惑,因为我还是 erlang 的新手......所以,当牛仔调用 websocket_handle 并从那里我们调用 websocket_handle_ 所以任何 websocket_handle_ 都会返回它会回到 websocket_handle 正确吗?还是直接回复websocket??因为我很困惑该函数将返回到 websocket_handle..
  • 函数最后一条语句的值会返回给调用者。所以在这个例子中websocket_handle 将返回你在websocket_handle_ 中返回的元组。由于websocket_handle_websocket_handle 中的最后一条语句,因此这也将返回元组。
  • 是的,好的。它 websocket_handle_ return 将被返回,因为 websocket_handle 不会返回任何东西给 websocket..cool。 ..ty
  • 一个 Json 对象是一组无序的名称/值对。如果客户端可能以无序方式发送它,我看不出如何进行模式匹配...... E17 具有地图模式匹配,这样就可以了。但是有一个proplist?
【解决方案2】:

所以改成

websocket_handle({text, Msg}, Req, Handle) ->
    websocket_handle_({text, jiffy:decode(Msg)}, Req, Handle).

websocket_handle_({text, Pattern1}, Req, Handle) ->
    %% do stuff,
   {ok, Req, State};
websocket_handle_({text, Pattern2}, Req, Handle) ->
    %% do stuff,
     {reply, [OutFrame], Req, State};
websocket_handle_({text, PatternN}, Req, Handle) ->
    %% do stuff,
     {reply, OutFrame, Req, State}.

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 2016-08-02
    • 2013-05-30
    • 2016-07-19
    • 2014-07-17
    • 2019-05-09
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    相关资源
    最近更新 更多