我试图在我的应用程序中实现一个对WebSocket消息做出反应的actor,我开始尝试Anonymou Chat demo application中的代码。
// UserActor.scala
def receive = LoggingReceive {
case Message(muid, s) if sender == board =>
val js = Json.obj("type" -> "message", "uid" -> muid, "msg" -> s)
out ! js
case js: JsValue =>
(js \ "msg").validate[String] map { Utility.escape(_) } foreach { board ! Message(uid, _ ) }
case other =>
log.error("unhandled: " + other)
}
问题在于,当我发送消息时,它最终会出现在other
案例中。
[ERROR] [...] [...] [...] unhandled: {"msg":"user-moved"}
相反,它应该被处理为JsValue
。当我运行原始示例应用程序时,即使它是相同的代码,它仍然有效。
我注意到另一个不同之处可能是问题所在。此代码(来自上面的示例):
case Message(muid, s) if sender == board =>
val js = Json.obj("type" -> "message", "uid" -> muid, "msg" -> s)
out ! js
在示例应用程序中工作,但在我的应用程序中不起作用。为了使它在我的应用程序中工作,我必须使js
成为一个字符串:
case Message(muid, s) if sender == board =>
val js = Json.obj("type" -> "message", "uid" -> muid, "msg" -> s)
out ! js.toString
我使用Play 2.3.8和sbt 0.13 UserActor.scala:https://github.com/anhminh1981/anonymous_chat/blob/master/app/actors/UserActor.scala