#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
Комментарии:
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 });
С помощью этого вы можете проверить, какой новый документ создается, и как он сравнивается с существующим документом, который вы ожидали обновить.