我正在尝试在Ruby Grape API上创建服务器发送的事件。
问题在于,连接似乎一直都非常快地关闭,因为我一直在测试网页上都得到Connection closed事件。

正如我所看到的那样,客户端连接到服务器,但是我想知道为什么连接不是恒定的,为什么我没有收到使用线程发送的数据。

这是我的Ruby代码:

$connections = []

class EventsAPI < Sinantra::Base

  def connections
    $connections
  end

  get "/" do
    content_type "text/event-stream"
    stream(:keep_open) { |out|
      puts "New connection"
      out << "data: {}\n\n"
      connections << out
    }
  end

  post "/" do
    data = "data\n\n"
    connections.each { |out| out << data }
    puts "sent\n"
  end

end


这是我的Javascript:

  var source = new EventSource('http://localhost:9292/events');

  source.onmessage = function(e) {
      console.log("New message: ", e.data);
      showMessage(e.data);
  };

  source.onopen = function(e) {
      // Connection was opened.
  };

  source.onerror = function(e) {
      console.log("Source Error", e)
      if (e.eventPhase == EventSource.CLOSED) {
          console.log("Connection was closed");
          // Connection was closed.
      }
  };

  var showMessage = function(msg) {
      var out = document.getElementById('stream');
      var d = document.createElement('div')
      var b = document.createElement('strong')
      var now = new Date;
      b.innerHTML = msg;
      d.innerHTML = now.getHours() + ":" + now.getMinutes() + ":" +now.getSeconds() + "  ";
      d.appendChild(b);
      out.appendChild(d);
  };


编辑:我让它与GET方法一起工作(我将Grape :: API更改为Sinatra :: Base,因为Grape没有实现流)。现在,我接收到数据,但是连接没有保持活动状态,当我使用post方法时,数据永远不会到达浏览器。

预先感谢您的回答。

最佳答案

JS代码看起来正确。我的猜测是,您不应该为无限循环启动新线程。将会发生的是,主线程将继续执行,到达其块的末尾,并关闭http请求。然后,您分离的线程将写入到不存在的out流中。

更新以响应您的EDIT:SSE不支持POST。只能使用GET数据或Cookie将数据传递到SSE流程。

关于javascript - Ruby Grape服务器发送的事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29393077/

10-11 11:35