Установите для всех экземпляров значения значение null в базе данных реального времени: облачные функции Firebase - PullRequest
0 голосов
/ 21 июня 2020

Я хочу стереть все значения определенного идентификатора пользователя, связанного со многими различными ключами сообщений в моей базе данных, установив для идентификатора пользователя значение null. Идентификаторы пользователей прикреплены к ключам сообщений в пути: posts / ivies / userIDs в моей базе данных. Вот как выглядит база данных:

Структура базы данных

Итак, я решил запустить следующее для l oop, чтобы отфильтровать идентификатор пользователя и превратить его в null:

exports.wipeData = functions.https.onRequest(async (req, res) => {
 const original = 'ppPXA8MvaSRVbmksof0ByOzTxJ92';
    const snapshot = await admin.database().ref('/posts/ivies/userIDs/');
    console.log((snapshot));

    for (let value in snapshot.val) {
      if (value == original) {
      snapshot.val.set("null")
      }
      else {
        console.log(value)
      }
    }

    res.redirect(303, snapshot.ref.toString());

// [END adminSdkPush]
});

Хотя эта функция развертывается и запускается, она выполняет не превращайте ppPXA8MvaSRVbmksof0ByOzTxJ92 в null, как ожидалось. Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Ваш общий подход кажется прекрасным, но у вас есть несколько ошибок.

Это должно работать лучше:

exports.wipeData = functions.https.onRequest(async (req, res) => {
  const original = 'ppPXA8MvaSRVbmksof0ByOzTxJ92';
  const ref = admin.database().ref('/posts/ivies/userIDs/');
  const query = ref.orderByValue().equalTo(original);

  const results = await query.once('value');
  const updates = {};
  results.forEach((snapshot) => {
    updates[snapshot.key] = null;
  });

  await ref.update(updates);

  res.status(200).send(JSON.stringify(updates));
})

Основные изменения:

  • Ваша переменная snapshot еще не содержит данных, поскольку вы не читаете данные из базы данных. once('value') в моем коде выполняет это чтение.
  • Этот код использует запрос для выбора только тех узлов, которые имеют правильное значение. Когда у вас растет количество пользователей, это значительно снижает нагрузку на базу данных (и стоимость).
  • Этот код сначала собирает все обновления в один объект, а затем отправляет их в базу данных одним вызовом.
  • await в await ref.update(updates), вероятно, является основным исправлением, поскольку оно гарантирует, что перенаправление выполняется только после завершения записи в базу данных.
0 голосов
/ 21 июня 2020

Я не знаком с облачными функциями firebase, но в обычном коде firebase на стороне клиента val нужно вызывать как функцию, и вам нужно ждать значения из ссылки. Вы можете попробовать:

exports.wipeData = functions.https.onRequest(async (req, res) => {
  const original = 'ppPXA8MvaSRVbmksof0ByOzTxJ92';
  const userIDs = await admin.database().ref('/posts/ivies/userIDs/');
  userIDs.once("value", snapshot => {
    var lookup = snapshot.val();
    for (let key in lookup) {
      var value = lookup[key];
      if (key == value) {
        userIDs.child(key).set(null);
      }
    }
    res.redirect(303, userIDs.ref.toString());
  });
});
...