【问题标题】:Firestore pre-deployment scriptFirestore 预部署脚本
【发布时间】:2021-04-22 08:10:42
【问题描述】:

我正在寻找一种将预部署脚本添加到我的 Firebase 项目的方法。
我正在使用 Firestore,并且我的安全规则设置为只有云功能可以写入 Firestore。

我已在我的用户表中添加了一个用户角色字段,该字段会在 userCreate 中自动填充。这工作正常,但我的产品环境仍然有没有此字段的用户。
一个合乎逻辑的解决方案是运行一个预部署命令,将此字段添加到所有现有用户,但我不知道如何执行此操作。

我目前最好的解决方案是专门为这种一次性使用创建一个云功能并触发它。 感觉这不是处理此类事情的正确方法。
如何在 Firestore 上运行一次性更新语句?

【问题讨论】:

  • 你好@Jonathan,问题解决了吗?请随时提出任何后续问题。您也可以通过单击对勾图标来接受答案,以便其他人知道它已解决。

标签: firebase google-cloud-firestore


【解决方案1】:

您可以使用 Firebase Admin SDK 编写一个临时脚本并执行一次。流程看起来像:

  1. 获取所有没有 userRole 字段的文档。
  2. 在数组中添加更新语句并立即执行所有承诺。

这是一个演示:

const admin = require("firebase-admin");

const serviceAccount = require("/path/to/serviceAccountKet.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://fate-bot-discord.firebaseio.com"
});

async function addRoles() {
    try {
        const userColRef = admin.firestore().collection("users")
        const users = await userColRef.where("userRole", "==", "").get()
        const updates = []

        users.docs.forEach((user) => {
            updates.push(userColRef.doc(user.id).update({ userRole: "theNewRole" }))
        })
        await Promise.all(updates)
        console.log("Roles added successfully")
        return "Roles Added"
    } catch (error) {
        console.log(error);
        return error
    }
}

//Call the function
addRoles().then((response) => {
  console.log(response)
}).catch((e) => {
  console.log(e)
})

如果您需要进一步的帮助,请告诉我!

【讨论】:

  • 如果涉及到 Node.js,我是个菜鸟。如何解决 firebase-admin 从 Node 将其作为一次性脚本运行?
  • @Jonathan 当然。创建一个新文件,例如 onetime.js。粘贴上面的代码。进行必要的更改,例如您提到的集合 ID 和字段名称和角色。然后打开终端/CMD并运行node ontime.js,文件应该执行一次。
  • 上面写着Error: Cannot find module 'firebase-admin',我全局安装了firebase-admin
  • @Jonathan 请按照以下命令重试: 1. 创建一个新文件夹 2. 在其中使用 npm init 并进行设置。 3. npm i firebase-admin (not global) 4. onetime.js... 还要确保您使用了服务帐户密钥的正确路径
【解决方案2】:

我已经更新了@Dharmaraj 答案,增加了一些额外的功能,以防有人需要。

const admin = require('firebase-admin');
// DEV
const serviceAccount = require('./x-dev-firebase-adminsdk-1234.json');
// PROD
// const serviceAccount = require('./x-firebase-adminsdk-1234.json');
const newRoles = [0];
const emails = ['admin1@gmail.com', 'admin2@gmail.com'];

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
});

const addRoles = async () => {
  try {
    let userColRef = admin.firestore().collection('users');
    if (emails.length) {
      userColRef = userColRef.where('email', 'in', emails);
    }

    const users = await userColRef.get();

    const updates = [];

    users.docs.forEach((doc) => {
      const user = doc.data();
      let existingRoles = [];
      if (user.roles) {
        existingRoles = user.roles;

        if (newRoles.every((role) => existingRoles.includes(role))) {
          return;
        }
      }

      const roles = Array.from(new Set(existingRoles.concat(newRoles)));

      updates.push(doc.ref.set({ roles }, { merge: true }));
    });

    await Promise.all(updates);

    console.log(
      `Role${newRoles.length > 1 ? 's' : ''} added to ${updates.length} user${
        updates.length !== 1 ? 's' : ''
      }.`
    );
    return true;
  } catch (error) {
    console.log(error);
    return error;
  }
};

addRoles().catch((e) => {
  console.log(e);
});

顺便说一句,您可以在此处创建服务帐户。

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 2018-04-18
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多