云功能导出Firestore备份数据,使用firebase-admin或@google-cloud/firestore?

au9on6nz  于 2023-06-24  发布在  Go
关注(0)|答案(4)|浏览(115)

我目前正在尝试构建一个云函数,将我的Firestore数据导出到存储桶。
我在Firebase DOC上找到的唯一一个关于如何做到这一点的例子:
https://googleapis.dev/nodejs/firestore/latest/v1.FirestoreAdminClient.html#exportDocuments

示例

const firestore = require('@google-cloud/firestore');

const client = new firestore.v1.FirestoreAdminClient({
  // optional auth parameters.
});

const formattedName = client.databasePath('[PROJECT]', '[DATABASE]');
client.exportDocuments({name: formattedName})
  .then(responses => {
    const response = responses[0];
    // doThingsWith(response)
  })
  .catch(err => {
    console.error(err);
  });

从这个例子中,似乎我需要安装@google-cloud/firestore作为我的云函数的依赖项。
但是我想知道我是否可以使用onlyfirebase-admin包访问这些方法。
我之所以这么想,是因为firebase-admin已经有了@google-cloud/firestore作为依赖项。

> firebase-admin > package.json

"dependencies": {
    "@firebase/database": "^0.4.7",
    "@google-cloud/firestore": "^2.0.0",    // <---------------------
    "@google-cloud/storage": "^3.0.2",
    "@types/node": "^8.0.53",
    "dicer": "^0.3.0",
    "jsonwebtoken": "8.1.0",
    "node-forge": "0.7.4"
  },

问题:

有没有可能得到一个FirestoreAdminClient的示例,并使用exportDocuments方法只使用firebase-admin
或者我真的需要将@google-cloud/firestore作为直接依赖项安装并直接使用它吗?

j5fpnvbx

j5fpnvbx1#

你访问管理客户端的方式是正确的,据我所知。

const client = new admin.firestore.v1.FirestoreAdminClient({});

但是,您可能不会得到任何TypeScript/intellisense帮助,因为Firestore库实际上并没有为v1 RPC定义详细的类型。注意它们是如何用any类型声明的:https://github.com/googleapis/nodejs-firestore/blob/425bf3d3f5ecab66fcecf5373e8dd03b73bb46ad/types/firestore.d.ts#L1354-L1364

mrphzbgm

mrphzbgm2#

下面是我使用的一个实现,它允许您根据firebase提供的模板https://firebase.google.com/docs/firestore/solutions/schedule-export执行任何需要执行的操作
在我的例子中,我从firestore中过滤出集合,我不希望调度程序自动备份

const { Firestore } = require('@google-cloud/firestore')

const firestore = new Firestore()
const client = new Firestore.v1.FirestoreAdminClient()
const bucket = 'gs://backups-user-data'

exports.scheduledFirestoreBackupUserData = async (event, context) => {
  const databaseName = client.databasePath(
    process.env.GCLOUD_PROJECT,
    '(default)'
  )

  const collectionsToExclude = ['_welcome', 'eventIds', 'analyticsData']

  const collectionsToBackup = await firestore.listCollections()
    .then(collectionRefs => {
      return collectionRefs
        .map(ref => ref.id)
        .filter(id => !collectionsToExclude.includes(id))
    })

  return client
    .exportDocuments({
      name: databaseName,
      outputUriPrefix: bucket,
      // Leave collectionIds empty to export all collections
      // or define a list of collection IDs:
      // collectionIds: ['users', 'posts']
      collectionIds: [...collectionsToBackup]
    })
    .then(responses => {
      const response = responses[0]
      console.log(`Operation Name: ${response['name']}`)
      return response
    })
    .catch(err => {
      console.error(err)
    })
}
bzzcjhmw

bzzcjhmw3#

以下是关于如何通过混合Cloud Scheduler、PubSub和Firebase Function https://firebase.google.com/docs/firestore/solutions/schedule-export来执行自动Firestore备份的完整代码解释(我使用它,效果非常好)

lf5gs5x2

lf5gs5x24#

firebase-admin只是 Package Cloud SDK并重新导出其符号。您可以使用 Package 器,或直接使用Cloud SDK,甚至可以根据需要将两者结合使用。如果你想同时使用这两种方法,你必须在@google-cloud/firestore上声明一个显式的依赖项,以便能够直接将其导入到代码中。

相关问题