我希望我的Firebase Web应用程序上载一个文件,并且我想要一个云功能来发现该文件并根据其内容创建一个数据库对象。这是我尝试过的许多产品的最后一个……
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:函数返回了未定义的,预期的Promise或 值
错了。 file().download()
的文档说它返回了一个诺言……。更重要的是,数据库set()
没有运行。
对于这个看似主流的用例,谷歌文档是如此令人困惑和晦涩(我认为错了吗?),我感到惊讶。如果有人可以帮助,这是非常有义务的。
答案 0 :(得分:1)
正如您将在File
对象的Google Cloud Storage Node.js客户端的文档中看到的那样,您必须省略回调以使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: ......
});
});