从 firebase 云功能获取云存储文件

goo*_*son 2 google-cloud-storage firebase google-cloud-functions google-cloud-firestore

我希望我的 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
    })
  });
});
Run Code Online (Sandbox Code Playgroud)

上传了非常小的文件,并运行此触发器。当我不尝试获取文件的内容时,数据库对象创建得很好(使用文字字符串而不是文件结果)。

但是当我如上所示运行它时,首先我收到一条警告:

onStorageFinalize:函数返回未定义、预期的 Promise 或值

那是错误的。文档file().download()说它返回一个承诺......而且,更重要的是,数据库set()没有运行。

我对谷歌文档在这个看似主流的用例中的混乱和晦涩(我认为错了?)感到震惊。如果有人可以提供帮助,非常感谢。

Ren*_*nec 6

正如您将在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: ......
        });

    });
Run Code Online (Sandbox Code Playgroud)

  • 我当然感谢你的帮助!!我找到了 blob 的文档并使用了 `data[0].toString()` (2认同)