Как использовать firebase-tools из скрипта NodeJS?

#javascript #node.js #firebase #google-cloud-firestore #firebase-tools

#javascript #node.js #firebase #google-облако-firestore #firebase-tools

Вопрос:

Я хочу удалить коллекцию Firestore и ее вложенные коллекции из скрипта NodeJS (не из облачной функции). Я не могу правильно выбрать проект.

Чтобы было ясно, я хочу выполнить то же, что и эта команда CLI, но из скрипта:

 firebase -P my-project firestore:delete fruits --recursive
  

Вот моя попытка:

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

const serviceAccount = require("path_to_my_service_account_key.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: `https://my-project.firebaseio.com`,
});

const firebaseTools = require("firebase-tools");

firebaseTools.use("my-project");

async function deleteCollection(collectionName) {
    const ref = admin.firestore().collection(collectionName);
    const res = await firebaseTools.firestore.delete(ref);
    console.log("delete success:", res);
}

deleteCollection("fruits");
  

Он выдает «TypeError: не удается создать свойство ‘project’ в строке ‘easypinger-test'» в firebaseTools.используйте строку.
Если я удалю его, он выдает «TypeError: не удается прочитать свойство ‘project’ неопределенного» из команды удаления.
Как я могу сделать это правильно?

Комментарии:

1. Я не уверен, откуда у вас возникла идея позвонить firebaseTools.use() . Возможно, вы хотите начать с кода в документации. Обратите внимание, что delete() принимает два аргумента. firebase.google.com/docs/firestore/solutions/delete-collections

2. Спасибо! Это работает при передаче информации о проекте в качестве параметра delete . Я искал способ указать проект, к которому будут применяться мои команды, у меня возникла неправильная идея вызова use , прочитав команды здесь: firebase.google.com/docs/cli#admin-commands

3. Если вы разместите свою ссылку в качестве ответа, я могу ее принять.

4. Если вы хотите удалить всю базу данных при эмуляции, полезно знать, что для этого есть специальный API-интерфейс эмулятора. github.com/firebase/firebase-js-sdk/blob/master/packages /…

Ответ №1:

Пример, приведенный на веб-сайте firebase, работает, если вы работаете в функции firebase.

Если вы не используете функции firebase, вам не нужно полагаться на firebase-functions пакет, чтобы получить действительный токен functions.config().fb.token .

Например, вместо этого вы могли бы использовать firebase-admin пакет.

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

admin.initializeApp({
  // APP OPTIONS
});

const cred = admin.app().options.credential;
if (!cred) {
  throw new Error('Admin credential was undefined');
}
const access_token = (await cred.getAccessToken()).access_token;

await firebase_tools.firestore
  .delete(path, {
    project: process.env.GCLOUD_PROJECT,
    recursive: true,
    yes: true,
    token: access_token
  });
  

Ответ №2:

Документация по удалению коллекций с помощью firebase-tools предоставляет шаблон для работы. Если вы хотите указать проект, обратите внимание, что delete() он принимает два параметра. Например:

 firebase_tools.firestore
    .delete(path, {
        project: YOUR-PROJECT-ID-HERE,
        recursive: true,
        yes: true,
        token: functions.config().fb.token
    });