用于导出 Firestore 备份数据的云功能。使用 firebase-admin 还是 @google-cloud/firestore?

cbd*_*per 11 node.js firebase google-cloud-functions firebase-admin google-cloud-firestore

我目前正在尝试构建一个云函数来将我的 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);
  });
Run Code Online (Sandbox Code Playgroud)

从那个例子来看,我似乎需要安装@google-cloud/firestore作为我的云功能的依赖项。

但是我想知道是否可以使用firebase-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"
  },
Run Code Online (Sandbox Code Playgroud)

题:

是否可以仅使用 来获取 的实例FirestoreAdminClient并使用该exportDocuments方法firebase-admin

还是我真的需要将其安装@google-cloud/firestore为直接依赖项并直接使用它?

Hir*_*aka 11

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

const client = new admin.firestore.v1.FirestoreAdminClient({});
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以执行类似的操作来获得 TypeScript/intellisense 工作(仅限 TypeScript,抱歉 Flow 用户:/) `import { FirestoreAdminClient } from '@google-cloud/firestore/build/src/v1/firestore_admin_client';` `const FirestoreV1AdminClient = admin.firestore.v1.FirestoreAdminClient 作为 FirestoreAdminClient 的类型;` (2认同)

ara*_*lie 5

这是我正在使用的一个实现,它允许您根据 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)
    })
}
Run Code Online (Sandbox Code Playgroud)

  • @Vojtěch 可能是这种情况,是的,因为我目前的功能仍在 Node 8 上运行......如果您找到修复程序,也请告诉我。 (2认同)