我正在尝试通过此处的代码解决问题。我有一个node.js文件(服务器端)和一个index2.html(客户端)。我正在尝试在服务器端读取html文件并编写浓度。
服务器端:
switch (pathname) {
case '/a':
res.writeHead(200, {'Content-Type': 'text/html'});
fs.readFile('./index.html', function(err, index) {
if(err){
console.log(err);
}
res.write(index + "\n\n");
res.end();
});
客户端(index2.html)
<!DOCTYPE html>
<html>
<body>
<p id="status"></p>
<script>
const source = new EventSource("");
if(typeof(EventSource) === "undefined") {
source.onopen = function(event) {
document.getElementById("status").innerHTML = "Connection lost...";
};
} else {
source.onopen = function(event) {
document.getElementById("status").innerHTML = "Connection opened...";
};
}
</script>
</body>
</html>
我不会收到任何连接文字。没有丢失或打开?
感谢您的帮助。
答案 0 :(得分:2)
请求单个数据项(示例中index2.html的内容)然后关闭连接不是EventSource的目的;相反,它旨在保持套接字开放,以便服务器将来可以向客户端推送更多数据。您应该在这里使用简单的AJAX连接。
但是,您仍然应该可以使用EventSource
。第一个解决方法是它需要自己的mime类型,而不指定text / html。
res.writeHead(200, { "Content-Type": "text/event-stream" });
第二,SSE协议意味着每个数据块都以“ data:”为前缀,并以两个LF为后缀。因此您的行应如下所示:
res.write("data:" + index + "\n\n");
您显然需要确保index
不包含任何\n
。因为它是HTML,所以您可以将它们全部转换为空格(除非您有<pre>
个块!)。更为通用的解决方案是将所有数据包装在JSON对象中,然后在客户端上解压缩该JSON。
最后,给出URL时,您问题中的客户端代码有""
错字。我以为这只是在写问题时的错字!但是,如果它是您的原始照片,那也将停止所有工作:-)
使用浏览器中的开发人员工具可以捕获此类问题(并查看SSE数据来回传递,因此您还可以消除其他问题,例如防火墙)。