从firebase云函数获取云存储文件

从firebase云函数获取云存储文件,firebase,google-cloud-firestore,google-cloud-storage,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Storage,Google Cloud Functions,我希望我的firebase web应用程序上传一个文件,我希望有一个云功能,可以发现这个文件并根据其内容创建一个数据库对象。这是我尝试过的许多方法的最后一个变体 const functions = require('firebase-functions'); const admin = require('firebase-admin'); const { Storage } = require('@google-cloud/storage'); admin.initializeApp(); c

我希望我的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:函数返回未定义的、预期的承诺或 价值观

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


谷歌文档在这个看似主流的用例上是多么的混乱和模糊(我认为是错的?)。如果有人能提供帮助,我将不胜感激。

正如您将在该对象的Google Cloud Storage Node.js客户端的文档中看到的那样,您必须省略回调才能让
下载()
方法返回承诺

调用
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: ......
        });

    });

谢谢看起来你的回答也会回电话?箭头功能?但我现在就试试。。。谢谢。对不起,我的回答有错误,我忘了then()。我将修改它。我看到了您提供的链接(非常有用),但我正在尝试理解发送到promise
contents=data[0]的参数什么是数据,数据[0]中的“blob”是什么,如何查看文件中的纯文本?非常感谢您的帮助!!我找到了一个blob文档,并使用了
数据[0]。toString()