0Pricing
React Academy · Урок

Использование потоков SSE в React с EventSource

Подключитесь к конечной точке SSE с помощью EventSource в useEffect и отображайте потоковые данные в реальном времени

«Использование потоков SSE в React с EventSource» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Создание соединения EventSource

new EventSource(url) создаёт SSE-соединение с указанным URL. Браузер немедленно открывает HTTP GET-запрос с заголовком Accept: text/event-stream. Сервер оставляет это соединение открытым и передаёт события потоком. EventSource — встроенный в браузер API; для базового использования библиотека не требуется.

Состояния жизненного цикла соединения

EventSource имеет три состояния готовности: 0 (CONNECTING) — соединение устанавливается или восстанавливается, 1 (OPEN) — соединение установлено и события передаются, 2 (CLOSED) — соединение закрыто и повторно подключаться не будет. Проверьте eventSource.readyState, чтобы определить текущее состояние.

onmessage для обычных событий

Обработчик eventSource.onmessage срабатывает для событий сервера, у которых явно не указан тип события (сервер отправляет data: ... без поля event:). Обработчик получает объект события, в котором event.data содержит строковые данные. Обычно сервер сериализует данные с помощью JSON.stringify, поэтому при получении вы разбираете их с помощью JSON.parse.

Именованные пользовательские события

Сервер может отправлять именованные события: event: userJoined data: {"userId": "123"} . В браузере для прослушивания используйте eventSource.addEventListener('userJoined', handler). Это позволяет передавать несколько типов событий через одно SSE-соединение: у каждого типа есть собственный обработчик, благодаря чему код остаётся понятным и организованным.

Разбор данных event.data

Данные SSE поступают в виде строк. Для структурированных данных сервер отправляет JSON.stringify(payload), а клиент разбирает их: const data = JSON.parse(event.data). Всегда заключайте JSON.parse в конструкцию try/catch, чтобы корректно обрабатывать некорректный JSON от сервера: записывайте ошибку в журнал и пропускайте повреждённое событие.

useEffect для жизненного цикла EventSource

Создавайте и закрывайте EventSource внутри useEffect: создайте соединение при монтировании компонента, подключите обработчики событий и верните функцию очистки, вызывающую eventSource.close(). Без очистки соединение не закрывается при размонтировании компонента, переходе пользователя на другую страницу или повторном запуске эффекта с другими зависимостями.

Обновление состояния при получении сообщения

В обработчике eventSource.onmessage обновляйте состояние React, чтобы отразить новые данные: setMessages(prev => [...prev, JSON.parse(event.data)]). Используйте функциональную форму setState, чтобы избежать проблем с устаревшим замыканием: обработчик события сохраняет исходное значение состояния, а функциональное обновление гарантирует работу с самой свежей версией состояния.

Автоматическое переподключение

EventSource автоматически переподключается, если соединение потеряно из-за сетевой ошибки или перезапуска сервера. Браузер ждёт небольшую задержку (обычно 3 секунды, задаваемую сервером с помощью retry: 3000 в потоке), а затем переподключается. Вам не нужно реализовывать логику переподключения — она встроена в API EventSource.

Заголовок Last-Event-ID

EventSource отслеживает идентификатор последнего полученного события (заданный сервером с помощью id: 123 в потоке). При переподключении браузер автоматически отправляет этот идентификатор в HTTP-заголовке Last-Event-ID. Хорошо спроектированный сервер использует его для повторной отправки пропущенных событий, благодаря чему при переподключении ни одно событие не теряется.

Передача учётных данных и заголовков

EventSource напрямую не поддерживает пользовательские заголовки. Для аутентификации используйте файлы cookie (new EventSource(url, { withCredentials: true }) отправляет файлы cookie) или передавайте токен аутентификации в параметре строки запроса URL. Если вам нужны заголовки Authorization, используйте API Fetch с ReadableStream вместо EventSource, чтобы вручную обрабатывать ответ SSE.

Обработка ошибок соединения

Когда EventSource обнаруживает ошибку, срабатывает обработчик ошибок. Состояние готовности будет равно CONNECTING (если будет выполнена повторная попытка) или CLOSED (если нет). В обработчике ошибок проверьте состояние готовности, чтобы отличить временную сетевую ошибку (повторная попытка будет выполнена автоматически) от постоянного сбоя (сервер вернул статус, отличный от 200). При постоянных ошибках закройте соединение и уведомите пользователя.

Автоматическое переподключение EventSource

Что происходит, когда соединение EventSource прерывается из-за сетевой ошибки?

Итоги урока: EventSource в React

new EventSource(url) создаёт SSE-соединение с состояниями readyStates: CONNECTING, OPEN, CLOSED. Обычные события обрабатываются обработчиком сообщений, а именованные типы событий — с помощью addEventListener. JSON.parse(event.data) извлекает структурированную полезную нагрузку. Создавайте и освобождайте EventSource в useEffect. Автоматическое переподключение встроено: EventSource повторяет попытку после сетевых ошибок, используя Last-Event-ID для повторной отправки пропущенных событий. Для аутентификации используйте файлы cookie (withCredentials) или параметры строки запроса URL.

Часто задаваемые вопросы

Урок «Использование потоков SSE в React с EventSource» бесплатный?

Да — полный текст урока «Использование потоков SSE в React с EventSource» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Использование потоков SSE в React с EventSource»?

Подключитесь к конечной точке SSE с помощью EventSource в useEffect и отображайте потоковые данные в реальном времени Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Использование потоков SSE в React с EventSource»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сравнение SSE, WebSockets и опроса
  2. Использование потоков SSE в React с EventSource
  3. Шаблон длительного опроса и логика переподключения
  4. Создание ленты уведомлений в реальном времени
← Назад к React Academy