繁体   English   中英

在实时数据库中将值的所有实例设置为 null:Firebase Cloud Functions

[英]Set all instances of a value to null in Realtime Database: Firebase Cloud Functions

我想通过将用户 ID 转换为 null 来擦除连接到数据库中许多不同帖子键的特定用户 ID 的所有值。 用户 ID 附加到路径中的帖子键:我的数据库中的帖子/常春藤/用户 ID。 这是数据库的外观:

数据库结构

所以我决定运行以下 for 循环来过滤用户 ID 并将其转换为 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]
});

尽管此 function 已部署并运行,但它并没有像预期的那样将“ppPXA8MvaSRVbmksof0ByOzTxJ92”变为“null”。 谢谢您的帮助。

您的一般方法似乎很好,但是那里有一些错误。

这应该会更好:

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')执行该读取。
  • 此代码仅对具有正确值的节点使用查询 select。 当您的用户数量增加时,这会显着降低数据库负载(和成本)。
  • 此代码首先将所有更新收集到单个 object 中,然后将它们作为一次调用发送到数据库。
  • await await ref.update(updates)中的 await 可能是主要修复,因为它确保仅在数据库写入完成后才执行重定向。

我不熟悉 firebase 云函数,但在常规客户端 firebase 代码val需要称为 function 的值,您必须等待参考值。 你可以试试:

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());
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM