#javascript #firebase-realtime-database #google-cloud-functions #firebase-admin
#javascript #firebase-realtime-database #google-cloud-функции #firebase-администратор
Вопрос:
Я удаляю узел FRTDB, я хочу получить доступ к удаленным данным с этого узла. функции выглядят следующим образом:
exports.events = functions.database.ref('/events/{eventId}').onWrite(async (change, context) => {
const eventId = context.params.eventId
if (!change.after.exists() amp;amp; change.before.exists()) {
//data removed
return Promise.all([admin.database().ref(`/events/${eventId}/dayofweek`).once('value')]).then(n => {
const pms = []
const days = n[0]
days.forEach(x => {
pms.push(admin.database().ref(`${change.before.val().active ? 'active' : 'inactive'}/${x.key}/${eventId}`).set(null))
})
return Promise.all(pms)
});
else {
return null;
}
})
Проблема, с которой я сталкиваюсь, заключается в том, что
admin.database().ref(`/events/ ${EventID}/dayofweek
не зацикливайте данные, потому что кажется, что данных больше нет, поэтому forEach не работает. Как я могу получить доступ к этим данным и получить цикл удаленных данных?
Ответ №1:
Конечно, вы не сможете прочитать данные, которые были только что удалены. Функция запускается после завершения удаления. Если вы хотите получить только что удаленные данные, вы должны использовать change.before
, как описано в документации:
Объект изменения имеет
before
свойство, которое позволяет проверять, что было сохранено в базе данных в реальном времени до события. Свойство before возвращает DataSnapshot, где все методы (например, val() и exists()) ссылаются на предыдущее значение. Вы можете снова прочитать новое значение, либо используя исходный DataSnapshot, либо прочитавafter
свойство. Это свойство при любом изменении является другим DataSnapshot, представляющим состояние данных после того, как произошло событие.
Ответ №2:
Данные, которые были удалены из базы данных, фактически включены в вызов вашей облачной функции. Вы можете получить, если из change.before
.
exports.events = functions.database.ref('/events/{eventId}').onWrite(async (change, context) => {
const eventId = context.params.eventId
if (!change.after.exists() amp;amp; change.before.exists()) {
//data removed
days = change.before.val().dayofweek;
...
})