#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()