Firebase - установить обновление для автономной ситуации? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть экран комментариев со списком комментариев и текстовым полем внизу.У меня есть два способа сохранить комментарий с обновленным количеством комментариев:

1) Использование set ()

ref.child(commentsList).child(commentKey).set(true);
ref.child(commentsCount).set(++count);

2) Использование update ()

allCommentKeysArray[newCommentsKey] == true
var data = {
        commentscount: ++count,
        commentslist: { ...allCommentKeysArray}
    }
ref.child(path).update(data);

Теперь для ситуации офлайн, то есть, когда клиент отключается от Интернета, если я добавляю несколько комментариев в автономном режиме, вот что происходит в обоих случаях:

set () работает нормально.Все комментарии, которые пользователь добавил в автономном режиме, сохраняются в базе данных Firebase, когда клиент возвращается в онлайн-режим.

Но update () не работает в автономном режиме.Когда клиент возвращается в онлайн-режим, значения 'count' неверны, и только один ключ добавляется к узлу 'commentsList' в базе данных firebase.

Я хочу использовать update () вместо set (), но update () не работает в автономном режиме.Итак, я должен придерживаться set (), как мне нужно для достижения автономной функциональности, или есть ли лучший способ?

1 Ответ

0 голосов
/ 27 мая 2018

Технически метод update() работает нормально.Он просто не делает то, что вы хотите.: -)

Что теперь происходит в автономном сценарии:

  1. Автономный клиент добавляет комментарий
  2. Автономный клиент обновляет свой собственный счетчик комментариев
  3. Клиент возвращается в онлайн
  4. Клиент отправляет свой новый комментарий и свой счетчик комментариев на сервер

Проблема в том, что другой клиент мог также добавитькомментарий до # 4, и ваш клиент никогда не обновлял количество комментариев правильно.

Есть много способов справиться с этим, но многие из них быстро становятся довольно сложными.Самыми простыми на данный момент являются:

  1. Использование транзакции для добавления комментария и количества (как предложил Дуг в своем комментарии).Это простейшее решение, но оно не будет работать, когда клиент находится в автономном режиме.
  2. Использование облачных функций для увеличения счетчика, как показано в functions-samples repo .Но поскольку облачные функции запускаются на серверах Google, это тоже не будет работать в автономном режиме.
  3. Использование правил безопасности Firebase на стороне сервера для проверки того, что обновление, отправляемое клиентом, разрешено только в том случае, если изменение в commentscount соответствуетизменение (я) в фактических комментариях к операции.Это довольно сложно, но имеет то преимущество, что оно будет работать, когда клиент находится в автономном режиме.В приведенном выше сценарии результатом может быть то, что сервер отклоняет запись, и ваш клиент может затем повторить попытку с шага 2 (после обновления счетчика комментариев на правильное значение с сервера).Если вы хотите исследовать этот путь, он похож на то, что я продемонстрировал в своем ответе здесь: https://stackoverflow.com/a/37956590
...