Firebase Cloud Functions удаляет узлы сразу после, а не через 24 часа

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

Вот мой файл index.js:

'use strict';

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

// Cut off time. Child nodes older than this will be deleted.
const CUT_OFF_TIME = 24 * 60 * 60 * 1000; // 2 Hours in milliseconds.


exports.deleteOldMessages = functions.database.ref('/Message/{chatRoomId}').onWrite(async (change) => {
const ref = change.after.ref.parent; // reference to the parent
const now = Date.now();
const cutoff = now - CUT_OFF_TIME;
const oldItemsQuery = ref.orderByChild('seconds').endAt(cutoff);
const snapshot = await oldItemsQuery.once('value');
// create a map with all children that need to be removed
const updates = {};
snapshot.forEach(child => {
updates[child.key] = null;
});
// execute all updates in one go and return the result to end the function
return ref.update(updates);
});

И моя структура базы данных: Firebase Cloud Functions удаляет узлы сразу после, а не через 24 часа

Многие разработчики сообщали о проблемах с реализацией этого, но, как и в случае с здесь на прошлой неделе, проблема всегда заключалась в вносимом ими изменении. Например: каково значение cutoff, когда вы его регистрируете? Как это соотносится со значением seconds в вашем JSON?

Frank van Puffelen 27.05.2019 03:35

@FrankvanPuffelen Извините, что задаю этот вопрос, но что вы подразумеваете под его регистрацией и как? Сохраненные секунды взяты из секунд с 1970 года.

Jaqueline 27.05.2019 04:42
console.info(cutoff), а затем проверьте панель ведения журнала ваших облачных функций. Если вы новичок в JavaScript, облачные функции для Firebase — не лучший способ его изучить. Я рекомендую сначала прочитать Документация Firebase для веб-разработчиков. Это охватывает многие основные взаимодействия JavaScript и базы данных Firebase. Вы также можете использовать Admin SDK в локальном процессе Node.js, который можно отлаживать с помощью локального отладчика. После этого вы будете намного лучше подготовлены к написанию кода для облачных функций.
Frank van Puffelen 27.05.2019 05:12

@FrankvanPuffelen Прошу прощения за поздний ответ. Я зарегистрировался и получил 1559331549417 в консоли. Что я должен делать дальше? Я ценю вашу помощь в этом

Jaqueline 01.06.2019 21:46
1559331549417 выглядит позже, чем любые ценности, которыми вы с нами поделились. По существу: сравните зарегистрированное значение со значениями в вашей базе данных и посмотрите, действительно ли они все старше этого. Если да, то проблема в том, как вы определяете значение cutoff.
Frank van Puffelen 01.06.2019 23:06

@FrankvanPuffelen Я только что попытался отправить еще одно сообщение и сравнить время. Время в базе данных — 1559426062, а время для зарегистрированного значения — 1559339672823. Может ли быть так, что время отсечки делает это в миллисекундах или что-то в этом роде? Время в базе данных находится в Date().timeIntervalSince1970 в Swift.

Jaqueline 01.06.2019 23:59

Это действительно похоже на то, что вы сохраняете время от клиента в секундах, что довольно часто встречается в iOS. Смотрите мой ответ здесь: stackoverflow.com/questions/52600881/…

Frank van Puffelen 02.06.2019 00:05

Я хочу удалять узлы после окончания дня, независимо от того, когда они были созданы. Как к этому подступиться?

Dheeraj Mahra 29.05.2020 09:40

@DheerajMahra, возможно, вы захотите изучить облачный планировщик. Это то, что я в конце концов сделал для своей цели, но я думаю, что вы могли бы сделать то же самое для себя.

Jaqueline 29.05.2020 17:55

Облачный планировщик @Jaqueline входит в план blaze. :(

Dheeraj Mahra 29.05.2020 19:34

@DheerajMahra да, но вы все еще получаете план искры, чтобы использовать бесплатный лимит. Вы также можете установить лимит платежа.

Jaqueline 29.05.2020 20:15

@Жаклин Нис. Позвольте мне изучить планы.

Dheeraj Mahra 30.05.2020 14:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
12
431
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

В комментариях вы указали, что используете Swift. Из этого и снимка экрана видно, что вы храните метку времени в секундах с 1970 года, в то время как код в ваших облачных функциях предполагает, что она указана в миллисекундах.

Самое простое исправление:

// Cut off time. Child nodes older than this will be deleted.
const CUT_OFF_TIME = 24 * 60 * 60 * 1000; // 2 Hours in milliseconds.


exports.deleteOldMessages = functions.database.ref('/Message/{chatRoomId}').onWrite(async (change) => {
    const ref = change.after.ref.parent; // reference to the parent
    const now = Date.now();
    const cutoff = (now - CUT_OFF_TIME) / 1000; // convert to seconds
    const oldItemsQuery = ref.orderByChild('seconds').endAt(cutoff);
    const snapshot = await oldItemsQuery.once('value');
    // create a map with all children that need to be removed
    const updates = {};
    snapshot.forEach(child => {
        updates[child.key] = null;
    });
    // execute all updates in one go and return the result to end the function
    return ref.update(updates);
});

Также см. мой ответ здесь: Как удалить дочерний узел после того, как определенная дата будет передана в облачных функциях Firebase?

Я пытался сделать это, и я все еще получаю тот же ответ, что и раньше, я не понимаю. Я также посмотрел на другой ответ, но функция выполняется в HTTP, а не в onWrite

Jaqueline 02.06.2019 01:17

То, как запускается функция, не должно иметь большого значения, пока вы подключаетесь ref. Если это все еще не работает, сделайте то же самое, что и раньше: зарегистрируйте cutoff и сравните его со значениями в вашей базе данных.

Frank van Puffelen 02.06.2019 01:52

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

Jaqueline 08.06.2019 20:03

Проблема в вашем исходном коде заключалась в сравнении секунд и миллисекунд, о которых я ответил. Если вы зарегистрируете значение cutoff, вы увидите, с чем вы сравниваете значение seconds в базе данных. Если вы сообщите нам, что он регистрирует, мы можем помочь с этим.

Frank van Puffelen 08.06.2019 21:13

Секунды, хранящиеся в базе данных, составляют 1560021980, а журнал отсечки — 1560021905247. Большое вам спасибо за помощь, я очень ценю это!

Jaqueline 08.06.2019 21:30

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

Frank van Puffelen 08.06.2019 21:34

Я определенно согласен! Я только что наткнулся на облачные функции и нашел, что они идеально подходят для того, что я пытаюсь сделать, а не пытаюсь сделать это на стороне пользователя. Это очень странно, я получаю те же результаты. Примерно через 2 секунды удаление занимает больше времени, но сообщения все равно удаляются сразу. Может ли это быть другим фактором? Вот журнал 1560043238.927 и вот значение базы данных 1560043316

Jaqueline 09.06.2019 03:27

у вас есть предложение, что я могу сделать?

Jaqueline 29.06.2019 14:30

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