保持节点JS连接打开并写入(GET请求)

我试图实现一个NODE的JS get方法,我可以在url参数中编码,并发送响应,如服务器发送事件。 例如,当我使用:

curl -D- 'http://localhost:8030/update' 

服务器将返回一条消息,然后保持连接打开,以返回更多消息(如Push)。 我正在使用require('connect'),我试着用require('express')但是不能使它工作。

这是我的代码的一部分:

 var http = require('http'); var connect = require('express'); var app = connect(); app.use(bodyParser.urlencoded({ extended: false })) .use(bodyParser.json()) // JSON .use(cors(corsOpts)) .get('/update', updateMiddleware); var server = http.createServer(app); server.listen("twserver.alunos.dcc.fc.up.pt", 8030); function updateMiddleware(req, res) { res.setHeader('Connection', 'keep-alive'); res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); res.writeHead(200); setTimeout(function() { res.write("this is an event"); res.flushHeaders(); }, 1000); setTimeout(function() { res.write("this is another event"); }, 2000); // should print without ending } 

编辑:我发现它正在工作,但只在铬。 在terminal,我只等了很长时间才收到信息,信息就像大块头一样。

您不能使用单个HTTP请求来侦听多个事件数据。 如果你真的坚持HTTP(即WebSocket或WebRTC不是一个选项),那么你正在寻找的技术称为长轮询 。 这基本上是这样工作的:

  • 客户端发送请求到服务器
  • 服务器等待事件发生(或者直到一个特定的但不是太长的超时,所以客户端应用程序不会为请求抛出超时错误)
  • 服务器响应一个完整的 http响应,包含事件的细节
  • 客户端收到事件的详细信息,并立即发送另一个请求,以收听更多事件。

这个方法确实利用了HTTP Keep-Alive

编辑:

对我来说,它看起来像你的代码不遵循服务器发送事件的协议。 这是一个教程: nodejs中的Server-Sent Events 。

在关于Server-Sent Events的MDN上的另一个教程之后,消息的结构应该如下:

 : this is a test stream data: some text data: another message data: with two lines 

请注意,要发送的数据后面必须紧跟一个双重的新行\n\n

socket.io或Webrtc是最好的select

一般来说,Express中的http端点不应该这样做。 如果您想要实时事件数据,最好的方法是使用Web套接字。

这就是说, 这个线程有如何强制Express来做到这一点的例子。