链接到文章:http://www.html5rocks.com/en/tutorials/eventsource/basics/
node.js SSE服务器在该示例中不起作用。我最终打开了与/events
的连接,但浏览器没有收到任何响应。
SSE-server.js
var http = require('http');
var sys = require('sys');
var fs = require('fs');
http.createServer(function(req, res) {
//debugHeaders(req);
if (req.headers.accept && req.headers.accept == 'text/event-stream') {
if (req.url == '/events') {
sendSSE(req, res);
} else {
res.writeHead(404);
res.end();
}
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(fs.readFileSync(__dirname + '/sse-node.html'));
res.end();
}
}).listen(8000);
function sendSSE(req, res) {
res.writeHead(200, {
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
});
var id = (new Date()).toLocaleTimeString();
// Sends a SSE every 5 seconds on a single connection.
setInterval(function() {
constructSSE(res, id, (new Date()).toLocaleTimeString());
}, 5000);
constructSSE(res, id, (new Date()).toLocaleTimeString());
}
function constructSSE(res, id, data) {
res.write('id: ' + id + '\n');
res.write("data: " + data + '\n\n');
}
function debugHeaders(req) {
sys.puts('URL: ' + req.url);
for (var key in req.headers) {
sys.puts(key + ': ' + req.headers[key]);
}
sys.puts('\n\n');
}
SSE-node.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<script>
var source = new EventSource('/events');
source.onmessage = function(e) {
document.body.innerHTML += e.data + '<br>';
};
</script>
</body>
</html>
答案 0 :(得分:2)
问题出在服务器上。在我的情况下,我使用iisnode节点包使用IIS节点。要解决这个问题,我需要在web.config中配置iisnode,如下所示:
<iisnode flushResponse="true" />
在此之后,一切正常。其他有类似问题的人可能会从这里开始,但是apache和nginx可能有类似的配置要求。
答案 1 :(得分:1)
为什么要在sendSSE函数末尾注释掉res.end()?这是实际将响应发送到浏览器的方法。
答案 2 :(得分:1)
我已经尝试过该代码并且正在为我工作,因为您没有使用ngnix或任何其他服务器作为您的节点实例的代理我会认为问题出在您的机器上,如果您运行防火墙或防病毒,停止它,再试一次或任何其他软件可以拦截你的req和res。
答案 3 :(得分:0)
确保已保存与同一目录中描述的sse-node.html同名的HTML文件。其他可能是确保在本地计算机上打开8000端口没有人使用它。或更改端口并重新运行sse-server.js。它按原样为我工作。
答案 4 :(得分:0)
我遇到了同样的问题。只需在HTML文件中提供完整资源地址,您的代码就没问题。
var source = new EventSource('http://localhost:8000/events'); //true way
代替
var source = new EventSource('/events'); //improper way