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

时间:2015-12-30 01:01:39

标签: javascript node.js

我正在尝试实现一个NODE JS get方法,我可以在url参数中编码并发回像Server Sent Events中的响应。 例如,当我使用时:

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

服务器将返回一条消息,然后保持连接打开以返回更多消息(如Push)。 我正在使用require(' connect'),我尝试使用require('表达'),但无法使其正常工作。

这是我的代码的一部分:

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
}
编辑:我发现它有效,但仅限于镀铬。在终端中,我只在等待很长时间后收到它,并且消息就像块一样。

3 个答案:

答案 0 :(得分:2)

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

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

此方法确实利用了 HTTP Keep-Alive

修改

对我而言,您的代码看起来不符合服务器发送事件的协议。这是一个教程:Server-Sent Events in nodejs

another tutorial on MDN about Server-Sent Events之后,消息的结构应如下:

: this is a test stream

data: some text

data: another message
data: with two lines

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

答案 1 :(得分:1)

socket.io或Webrtc是最佳选择

答案 2 :(得分:0)

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

话虽如此,this thread有一个关于如何强制Express执行此操作的示例。