Задать вопрос
@AlexNew22

Как правильно настроить SSE?

Подскажите, как настроить сервер, чтобы настроить отдачу страницы, а после при срабатывании каких-то событий на сервере отправлять эти данные на клиент, чтобы мы могли их там обработать и подредактировать данные на странице?

Ошибка на клиенте
GET https://localhost:9000/event net::ERR_CONNECTION_CLOSED


Клиент
let source = new EventSource("https://localhost:9000/event")

 source.addEventListener('join', event => {
  console.log('join event ' + event.data)
});

source.addEventListener('message', event => {
    console.log('message event ' + event.data)
});

source.addEventListener('leave', event => {
    console.log('leave event ' + event.data)
});


Сервер

const express = require('express')
const path = require('path')
const dirname = path.resolve()
const _static = path.join(dirname, '/static')

const app = express()
app.get('/', function (req, res) {
  res.sendFile(__dirname + '/static/index.html')
})

app.get('/event', function (req, res) {
  res.writeHead(200, {
    Connection: 'keep-alive',
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache'
  })
  let counter = 0
  setInterval(() => {
    res.write('counter from text ' + counter++)
  }, 1000)
})

app.use(express.static(path.join(_static)))
app.listen(9000)
  • Вопрос задан
  • 56 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Ne7Le4Der
Ну веб-сервер у нас работает в режиме запрос-ответ, т.е. клиент зашёл на example.com, ваш express отработал и отдал страницу/данные. После этого самостоятельно сервер вносить изменения в страницу клиенту не может. Есть несколько вариантов:

1) Long polling (кидаем запрос на сервер, а ответ на него получаем не сразу, а только тогда, когда сработает какой-то ивент, после этого кидаем снова и т.д.)
2) Судя по набору ивентов вы делаете какой-то чат, посмотрите в сторону WebSocket'ов, для этой цели они подойдут лучше

UPD: Ну, ещё есть вариант "в лоб", просто ддосить свой сервер запросами раз в N секунд, но это на любителя)))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы