Облачная функция Firestore не может найти документ для обновления

#node.js #firebase-realtime-database #google-cloud-firestore #google-cloud-functions

# #node.js #firebase-база данных в реальном времени #google-cloud-firestore #google-cloud-функции

Вопрос:

Я пытаюсь создать функцию онлайн-присутствия, которая обновляет онлайн-статус каждого пользователя с помощью flutter. Я добиваюсь этого, используя базу данных в реальном времени, облачные функции и облачный Firestore.

Моя проблема заключается в том, что я запускаю свою облачную функцию для обнаружения изменений в базе данных в реальном времени и обновления поля состояния в коллекции моего пользователя в cloud Firestore. Он продолжает говорить, что не может найти документ для обновления.

Вот мой код облачной функции

 const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

const firestore = admin.firestore();

exports.onUserStatusChange = functions.database
  .ref("/{uid}/status")
  .onUpdate(async (change, context) => {
    // Get the data written to Realtime Database
    const isOnline = change.after.val();

    // Then use other event data to create a reference to the
    // corresponding Firestore document.
    const userStatusFirestoreRef = firestore.doc(`users/${context.params.uid}`);
    
    console.log(`status: ${isOnline}`);

    return userStatusFirestoreRef.update({
      status: isOnline,
      last_seen: Date.now(),
    });
  });
 

вот ошибка в функции onUserStatusChange

 Error: 5 NOT_FOUND: No document to update: projects/posweepay/databases/(default)/documents/users/162057431950849
    at Object.callErrorFromStatus (/workspace/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client.js:176:52)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:342:141)
    at Object.onReceiveStatus (/workspace/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:305:181)
    at /workspace/node_modules/@grpc/grpc-js/build/src/call-stream.js:124:78
    at processTicksAndRejections (internal/process/task_queues.js:79:11)
 

Структура базы данных в реальном времени

Структура базы данных в реальном времени

Облачная структура базы данных Firestore

Облачная структура базы данных Firestore

Комментарии:

1. можете ли вы выполнить console.log (context.params.uid)?

2. где я могу просмотреть журналы?

3. я не думаю, что вижу его в своей консоли отладки flutter

4. в консоли firebase вы можете просмотреть журналы

5. Кажется, вы пытаетесь обновить пользователя идентификатором, соответствующим значению accountId поля, т.Е. 162057431950849

Ответ №1:

Из журналов похоже, что вы пытаетесь ссылаться на документ из user.accountid , а не использовать идентификатор документа.

Хотя accountid это может быть 162057431950849 (я предполагаю, что это UID документа в вашей базе данных реального времени) — фактический идентификатор документа в Firestore есть 615862116620550 .

Это похоже на несоответствие в вашей модели данных. Возможным решением может быть сохранение UID документа Firestore в вашей базе данных реального времени и использование этого значения для ссылки на документ Firestore при необходимости.

Ответ №2:

Хотя на первый взгляд идентификаторы пользователей на скриншотах совпадают, сообщение об ошибке, похоже, указывает на некоторое несоответствие.

Для устранения неполадок я рекомендую использовать операцию набора и слияния, которая также создаст документ, если он не существует:

 return userStatusFirestoreRef.set({
  status: isOnline,
  last_seen: Date.now(),
}, { merge: true });
 

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