получить файл облачного хранилища из облачной функции firebase

#firebase #google-cloud-firestore #google-cloud-storage #google-cloud-functions

#firebase #google-облачная платформа #google-облако-firestore #google-cloud-функции #google-облачное хранилище

Вопрос:

Я хотел бы, чтобы мое веб-приложение firebase загружало файл, и я хотел бы иметь облачную функцию, которая обнаруживает этот файл и создает объект базы данных на основе его содержимого. Вот последний вариант из многих, которые я пробовал…

 const functions = require('firebase-functions');
const admin = require('firebase-admin');
const { Storage } = require('@google-cloud/storage');

admin.initializeApp();
const db = admin.firestore();

exports.onStorageFinalize = functions.storage.object().onFinalize((object) => {
  const storage = new Storage();
  const bucket = storage.bucket('my app's storage bucket name');

  return bucket.file(object.name).download(function (err, contents) {
    // problem: no err, no contents, set doesn't run just a warning about promises!
    const result = `got err=${err}, contents=${contents}`
    return db.collection('myCollection').doc().set({
      result: result
    })
  });
});
  

Загружается очень маленький файл, и запускается этот триггер. Когда я не пытаюсь получить содержимое файла, объект базы данных создается нормально (с буквенной строкой вместо результата файла).

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

onStorageFinalize: функция возвращает неопределенное, ожидаемое обещание или значение

Это неправильно. В документе для file().download() говорится, что он возвращает обещание …. и, что более важно, база данных set() не запускается.

Я поражен тем, насколько запутанным и неясным (и я думаю, неправильным?) документы Google относятся к этому, казалось бы, распространенному варианту использования. Очень признателен, если кто-то может помочь.

Ответ №1:

Как вы увидите в документации к облачному хранилищу Google Node.js Клиент для File объекта, вы должны опустить обратный вызов, чтобы download() метод вернул обещание.

При вызове download() метода вы не возвращаете обещание, отсюда и получаемая ошибка.

Итак, вам нужно сделать следующее:

 return bucket.file(object.name).download()
    .then(data => {
        const contents = data[0];
        // Do something with the contents constant, e.g. derive the value you want to write to Firestore

        return db.collection('myCollection').doc().set({
           value: ......
        });

    });
  

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

1. Спасибо. Похоже, что ваш ответ также отправляет обратный вызов? Функция стрелки? Но попробую это сейчас … ценю это.

2. Извините, в моем ответе ошибка, я забыл then (). Я собираюсь его адаптировать.

3. Я вижу предоставленную вами ссылку (очень полезную), но я пытаюсь понять параметр, отправленный в promise contents = data[0]; что такое data, что такое «большой двоичный объект» в data[0], и как я могу увидеть обычный текст из моего файла?

4. Я очень ценю вашу помощь!! Я нашел документ для больших двоичных объектов и использовал data[0].toString()