Node.js: написать html с помощью источника событий - PullRequest
1 голос
/ 10 июня 2019

Я пытаюсь решить проблему с моим кодом здесь.У меня есть файл 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 Ответ

2 голосов
/ 12 июня 2019

Запрос отдельных элементов данных (содержимого index2.html в вашем примере) с последующим закрытием соединения - это не то, для чего предназначен EventSource;вместо этого он предназначен для того, чтобы держать сокет открытым, чтобы в будущем сервер мог отправить больше данных клиенту.Здесь вы должны использовать простое соединение AJAX.

Но вы все равно сможете использовать EventSource.Первое исправление заключается в том, что ему нужен собственный MIME-тип, не указывайте text / html.

res.writeHead(200, { "Content-Type": "text/event-stream" });

Во-вторых, протокол SSE означает, что каждый блок данных имеет префикс «data:» и суффикс двух.ЛФ.Таким образом, ваша строка должна выглядеть следующим образом:

res.write("data:" + index + "\n\n");

Вы, очевидно, должны убедиться, что index не содержит \n.Поскольку это HTML, вы можете преобразовать их все в пробелы (если у вас нет <pre> блоков!).Более общее решение состоит в том, чтобы обернуть любые данные в объект JSON, а затем распаковать этот JSON на клиенте.

Наконец, код на стороне клиента в вашем вопросе имеет опечатку "" при выдачеURL.Я предполагаю, что это была опечатка только при написании вопроса!Но если он будет в вашем оригинале, это также перестанет все работать :-) Используйте инструменты разработчика в вашем браузере, чтобы уловить подобные проблемы (и увидеть, как данные SSE передаются взад и вперед, так что вы также можете устранить другие проблемы,такие как брандмауэры).

...