我正在使用Heroku的EventSourceHQ。我没有使用现有的客户端,而是在Scala中重写客户端。这很简单,因为Ruby implementation显示。
创建套接字是成功的,客户端javascript似乎对生成的socket_id感到满意。但是当我在服务器eventsourcehq.com/event
上触发事件时,返回HTTP 200
,正文为{ }
。此外,浏览器中不执行任何事件处理程序。也就是说,服务器向eventsourcehq.com发送一个事件,但该事件不会在浏览器中转发给客户端。
我发布到服务器中的eventsourcehq(使用dispatch)的方法是:
val (key, secret, serviceURL) =
(properties("ESHQ_KEY"), properties("ESHQ_SECRET"), properties("ESHQ_URL"))
def createSocket(channel: String) = post("/socket", Map("channel" -> channel))
def publish(data: String, channel: String) = post("/event",
Map("channel" -> channel, "data" -> data))
private def post(path: String, params: Map[String, String]): ActionResult = {
val request = url(s"$serviceURL$path") << params << credentials
Await.result(Http(request).either, 5.seconds).fold(
{t => InternalServerError(s"Failed to post $request: ${t.getMessage}")},
{r => Ok(r.getResponseBody)}
)
}
private def credentials = {
val time = (System.currentTimeMillis / 1000).toString
Map("key" -> key, "timestamp" -> time, "token" -> token(key, secret, time))
}
private def token(strings: String*) = {
val md = java.security.MessageDigest.getInstance("SHA-1")
md.digest(strings.mkString(":").getBytes("UTF-8")).map("%02x".format(_)).mkString
}
与Ruby客户端一样,createSocket
(open
)和publish
(send
)方法都委托给相同的http发布逻辑。
在客户端:
var serverEvents = (function () {
var eshq = new ESHQ("forkpin");
// callback called when the connection is made
eshq.onopen = function(e) {
console.log("Open event", e);
};
// called when a new message with no specific type has been received
eshq.onmessage = function(e) {
console.log("Message type: %s, message data: %s", e.type, e.data);
};
// callback called on error
eshq.onerror = function(e) {
console.log("Error event", e);
};
return eshq;
})();
我哪里可能出错?我该如何进一步调试?
答案 0 :(得分:1)
就我所见,服务器端的所有内容都是正确的。您可以共享用于绑定到ESHQ事件的JavaScript代码吗?
此外,如果您计划开源此Scala客户端,我很乐意在eshq Github组织上进行设置,并为您提供访问权限。
答案 1 :(得分:0)
我用wireshark进一步调试了这个。我发现事件正在发布,但是消息是频道名称,频道名称是消息。我和我的参数混合在一起。
一年没有糕点。