получить файл облачного хранилища из облачной функции Firebase - PullRequest
0 голосов
/ 17 марта 2019

Мне бы хотелось, чтобы мое веб-приложение 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 Ответ

1 голос
/ 17 марта 2019

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

При вызове метода 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: ......
        });

    });
...