Функция автоматического удаления Firebase: удаление элемента в секундах при запросе на удаление через 2 часа - PullRequest
0 голосов
/ 10 октября 2019

Я не мог понять, что я делаю неправильно, поэтому мне нужен дополнительный глаз, чтобы понять, что я делаю неправильно. Я пробую один ответ на вопрос из Удалить данные базы данных старше 2 часов , в которых используются https://github.com/firebase/functions-samples/tree/master/delete-old-child-nodes и https://github.com/firebase/functions-samples/blob/master/delete-old-child-nodes/functions/index.js для удаления узла через некоторое время.

/root
  /items
    LoHgJSFt8hHi2o_hP: {
      timestamp: 1497911193083,
      ...some_other_data
    },
    LoHgJSsGGHi2o_fD: {
      timestamp: 1597911193083  
      ...some_other_data                  
    }

Мой index.js выглядит как

//index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const { createUser } = require('./auth/onCreate');
const { deleteOldData } = require('./auth/onDeleteOldData');
const serviceAccount = require('./ownerstown-admin.json');
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://ownexxxxxxxx-c86cf.firebaseio.com'
});
exports.createUser = functions.firestore.document('users/{userId}').onCreate(createUser);
exports.deleteOldData = functions.database.ref('/referralIds/ids/{pushId}').onWrite(deleteOldData);

, а затем onDeleteOldData.js

// auth/onDeleteOldData.js
const CUT_OFF_TIME = 2 * 60 * 60 * 1000;
async function deleteOldData(change) {
  console.log('starting nooowwwwwww');
  const ref = change.after.ref.parent;
  console.log('ref', ref);
  const now = Date.now();
  const cutoff = now - CUT_OFF_TIME;
  const oldItemsQuery = ref.orderByChild('timestamp').endAt(cutoff);
  const snapshot = await oldItemsQuery.once('value');
  console.log('snapshot', snapshot);
  const updates = {};
  snapshot.forEach(child => {
    updates[child.key] = null;
  });
  return ref.update(updates);
}
module.exports = {
  deleteOldData
};

, а нажатие данных в виде кнопки происходит нажатием

  function createLoginId() {
    const rootRef = Firebase.database.ref();
    const allDetails = rootRef.child('referralIds/ids');
    const timeStamp = Date.now();
    const someId = uuidv4();
    const { origin } = window.location;
    const data = {
      timeStamp,
      someId,
      createrId: id
    };
    const newRef = allDetails.push();
    newRef.set(data);
  }

Но как только я нажимаю на данные, они удаляются в секундах.

Что я делаю не так?

1 Ответ

1 голос
/ 10 октября 2019

Проблема возникает из-за того, что при записи в базу данных вы делаете

const timeStamp = Date.now();
//...
const data = {
  timeStamp,
  someId,
  createrId: id
};

, что означает, что вы сохраняете поле timeStamp, но ваша облачная функция выбирает узел (ы) дляудалено на основе timestamp (все в нижнем регистре).

Имена узлов в базе данных реального времени чувствительны к регистру.


Кстати, обратите внимание, что для отметки времени вы можете использовать

const timestamp = firebase.database.ServerValue.TIMESTAMP; 

, который является "значением заполнителя для автоматического заполнения текущей метки времени , определенной серверами Firebase ", см. https://firebase.google.com/docs/reference/js/firebase.database.ServerValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...