Node.js:使用Eventsource编写html

时间:2019-06-10 18:31:00

标签: html node.js eventsource

我正在尝试通过此处的代码解决问题。我有一个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>

我不会收到任何连接文字。没有丢失或打开?

感谢您的帮助。

1 个答案:

答案 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数据来回传递,因此您还可以消除其他问题,例如防火墙)。