Ошибка при попытке настроить автоматическое резервное копирование Firestore, облачная функция - PullRequest
0 голосов
/ 11 июля 2020

Я следую этому руководству здесь: Учебник

вроде все в порядке, и это позволяет мне делать все, что описано в учебнике, но когда я запускаю функцию, я получаю эту ошибку.

textPayload: "TypeError: Cannot read property 'charCodeAt' of undefined
    at peg$parsetemplate (/workspace/node_modules/google-gax/build/src/pathTemplateParser.js:304:17)
    at Object.peg$parse [as parse] (/workspace/node_modules/google-gax/build/src/pathTemplateParser.js:633:18)
    at new PathTemplate (/workspace/node_modules/google-gax/build/src/pathTemplate.js:55:54)
    at segments.forEach.segment (/workspace/node_modules/google-gax/build/src/pathTemplate.js:120:29)
    at Array.forEach (<anonymous>)
    at PathTemplate.render (/workspace/node_modules/google-gax/build/src/pathTemplate.js:114:23)
    at FirestoreAdminClient.databasePath (/workspace/node_modules/@google-cloud/firestore/build/src/v1/firestore_admin_client.js:904:57)
    at exports.scheduledFirestoreExport (/workspace/index.js:13:31)
    at Promise.resolve.then (/layers/google.nodejs.functions-framework/functions-framework/node_modules/@google-cloud/functions-framework/build/src/invoker.js:330:28)
    at process._tickCallback (internal/process/next_tick.js:68:7)
insertId: "000000-8410c5c7-8304-42b6-b2b6-dd55a54e8cab"
resource: {2}
timestamp: "2020-07-11T18:14:35.981Z"
severity: "ERROR"
labels: {1}
logName: "projects/b-b-b-app/logs/cloudfunctions.googleapis.com%2Fcloud-functions"
trace: "projects/b-b-b-app/traces/d7c07a715d0106225d9963ce2a046489"
receiveTimestamp: "2020-07-11T18:14:44.813410062Z"
}

Я не понимаю, в чем может быть проблема. Я изменил сегменты и идентификаторы приложений, как указано в руководстве.

Я использую план Blaze и могу экспортировать базу данных в корзину вручную с помощью команды оболочки и

gcloud firestore export gs: // bbbdata-backup

Я использую консоль GCP на сайте firebase и использую этот код.

const firestore = require('@google-cloud/firestore');
const client = new firestore.v1.FirestoreAdminClient();

const bucket = 'gs://bbbdata-backup'

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

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: [],
})
.then(responses => {
  const response = responses[0];
  console.log(`Operation Name: ${response['name']}`);
  return response;
})
.catch(err => {
  console.error(err);
});
};

1 Ответ

0 голосов
/ 11 июля 2020

У меня была аналогичная проблема в прошлом году, возможно, у вас нет разрешения, я бы сделал это так, надеюсь, это сработает для вас:

import * as functions from 'firebase-functions'
import { auth } from 'google-auth-library'

export const generateBackup = async () => {
  const client = await auth.getClient({
    scopes: [
      'https://www.googleapis.com/auth/datastore',
      'https://www.googleapis.com/auth/cloud-platform'
    ]
  })

  const path = `YOUR_FOLDER_NAME_FOR_THE_BACKUP`
  const BUCKET_NAME = `YOUR_BUCKET_NAME_HERE`

  const projectId = await auth.getProjectId()
  const url = `https://firestore.googleapis.com/v1beta1/projects/${projectId}/databases/(default):exportDocuments`
  const backup_route = `gs://${BUCKET_NAME}/${path}`

  return client.request({
    url,
    method: 'POST',
    data: {
        outputUriPrefix: backup_route,
        // collectionsIds: [] // if you want to specify which collections to export, none means all
    }
  })
  .catch(async (e) => {
    return Promise.reject({ message: e.message })
  })

}

Затем вы можете решить, что это ваш триггер для этого функцию и выполните ее соответствующим образом.

Примечание. Go в разделе IAM вашего проекта и найдите учетную запись службы App Engine, вам нужно будет добавить роль Cloud Datastore Import Export Admin, в противном случае произойдет сбой.

Подробнее об этом можно прочитать здесь Это очень подробно

Ура.

...