Firebase SSE отправляет весь файл json при открытии соединения

Я пытаюсь внедрить Firebase SSE для чата в игре Unity (для WebGL/Mobile) с библиотекой «BestHTTP», чтобы имитировать прослушиватель «child_added» или «child_changed» в SDK Javascript Firebase, который только недавно добавленные или обновленные данные будут отправлены клиенту.

Теперь моя проблема заключается в том, что когда соединение инициализируется и открывается, слушатель "put" всегда будет отправлять обратно жирный JSON, включая все данные в моем целевом узле firebase. После открытия события слушатель работает, как и ожидалось. Только обновленные данные будут отправлены обратно клиенту через прослушиватель «put».

Я новичок в SSE, и мне интересно, является ли это стандартным поведением SSE, или оно определяется собственным правилом Firebase, или проблемой из моего кода/библиотеки?

Firebase REST SSE: https://firebase.google.com/docs/reference/rest/database#section-streaming

void Init(){
    var eventSource = new EventSource(new Uri("https://{}.firebaseio.com/TestChatRoom.json"), 1);
    eventSource.On("put", OnPut);
    eventSource.Open();
}
void  OnPut(EventSource source, Message msg){
    DebugLog(string.Format("OnPut: <color=yellow>{0}</color>", msg.Data.ToString()));
}

==========Обновление==========

Решил это с помощью @Frank. Оказывается, я могу использовать те же параметры запроса в RestAPI Firebase для прослушивателя SSE. Все, что мне нужно, это добавить "orderBy="$key"&limitToLast=20" в мой URL-адрес запроса, чтобы он возвращал только последние 20 дочерних элементов после открытия соединения и продолжал обновляться при добавлении нового дочернего элемента.

Вот код, который у меня работает (C# для Unity, с плагином BestHTTP):

void Init(){
    var eventSource = new EventSource(new Uri("https://{}.firebaseio.com/TestChatRoom.json?orderBy=%22$key%22&limitToLast=20"), 1);
    eventSource.On("put", OnPut);
    eventSource.Open();
}
void  OnPut(EventSource source, Message msg){
    Debug.Log(msg.Data.ToString());
}

Есть ли причина, по которой вы используете REST API вместо предоставленной клиентской библиотеки для единства?

Doug Stevenson 18.12.2020 20:01

Кажется, что REST — единственный способ работать с мобильными/вебгл/редакторами. Мучительно... Официальная библиотека ориентирована на android/ios.

Ziii 18.12.2020 20:11

Что ж, возможно, вы захотите отредактировать вопрос, чтобы более подробно объяснить, что именно не работает так, как вы ожидаете, а также детали отладки. Мы не можем заглянуть внутрь вашей базы данных или наблюдать за выполнением вашего кода.

Doug Stevenson 18.12.2020 20:18

Спасибо. Добавлено дополнительное описание ожидаемого результата. Журнал отладки будет добавлен позже.

Ziii 18.12.2020 21:36
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
4
241
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы видите в ответе потоковой передачи REST, на самом деле является тем, как работают все клиенты Firebase (включая все SDK). Firebase синхронизирует состояние узла, на который вы подписаны, а не просто передает события, происходящие после начала подписки.

Если вы хотите получить только новые данные, вам придется запрашивать то, что ваше приложение считает «новым». Обычно это означает один из следующих подходов:

  • Сохраните ключ самого последнего узла, который вы видели, где-нибудь в локальном хранилище на клиенте, а затем OrderByKey().StartAt("thatKey").
  • Сохраните метку времени в каждом дочернем узле, а затем либо начните с последней метки времени, которую вы видели, либо начните сейчас.

Спасибо, Фрэнк, удалось решить эту проблему с помощью вашей подсказки!

Ziii 27.12.2020 13:39

Другие вопросы по теме

Перезапись хостинга с собственным доменом для функции не работает
UNAUTHENTICATED: для учетных данных требуется канал с уровнем безопасности PRIVACY_AND_INTEGRITY. Наблюдаемый уровень безопасности: НЕТ
Использование данных Cloud Firestore в облачной функции
Отправляйте электронные письма из Firebase, не отключая встроенную службу электронной почты.
Как включить базу данных Firebase Realtime в GCP?
Как загрузить файл PDF после загрузки в хранилище Firebase, показать в приложении Flutter и сохранить его всегда статичным
Flutter WEB: Firebase: приложение Firebase «[ПО УМОЛЧАНИЮ]» не создано
Как показать изображение, загруженное из хранилища firebase, всегда в приложении флаттера статически, его можно открыть и просмотреть одним щелчком мыши
Невозможно решить ошибку CORS в nuxt при запуске функции razorpay, написанной в функциях firebase.
Как заблокировать доступ определенных IP-адресов к вашему сайту на хостинге Firebase