我正在尝试实现一个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
}
编辑:我发现它有效,但仅限于镀铬。在终端中,我只在等待很长时间后收到它,并且消息就像块一样。
答案 0 :(得分:2)
您不能使用单个HTTP请求来侦听多个事件数据。如果您真的遇到HTTP(即WebSocket或WebRTC不是一个选项),那么您正在寻找的技术称为long polling。这基本上是这样的:
此方法确实利用了 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执行此操作的示例。