带有 Google 操作的 Firebase 存储

Posted

技术标签:

【中文标题】带有 Google 操作的 Firebase 存储【英文标题】:Firebase Storage with Google Actions 【发布时间】:2021-08-28 15:31:06 【问题描述】:

我在将我的 Firebase 存储与我的 google 操作连接时遇到了一些问题。我需要能够“下载”内部的 json 文件,以便能够读取并挑选出用户在调用操作时提供的数据可能需要什么。

以下是我目前拥有的代码,根据我发现的不同 API 和其他 *** 问题编写而成。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const Firestore = require('@google-cloud/firestore');
const firestore = new Firestore();

var storage = require('@google-cloud/storage');
const gcs = storage(projectId: 'aur-healthcare-group');
const bucket = gcs.bucket('gs://aur-healthcare-group');


admin.storage().bucket().file('aur-healthcare-group/aur_members.json').download(function(errr, contents)
  if(!err)
    var jsObjext = JSON.parse(contents.toString('utf8'));
  
);

我收到的当前错误是 "code":3,"message":"Function failed on loading user code。这可能是由于用户代码中的错误。错误消息:错误:请检查您的函数日志以查看错误原因。当我检查日志时,我只会再次收到上述消息。

我认为我没有正确访问我的 Firebase 存储,并且无法找到有关如何正确访问它的好资源。谁能给我一个如何正确访问存储的示例,以便我能够将其应用到我的项目中?

【问题讨论】:

欢迎来到 SO。您收到的错误非常模糊 - 想象一下当我们甚至不知道错误是什么时我们的感受!超级模糊。请在问题中包含错误并告诉我们您进行了哪些故障排除。你有没有逐行检查你的代码并检查你的变量?您是否确保您的规则设置正确或确保您的用户已通过身份验证? @Jay 我在描述中添加了更多信息,希望对您有所帮助。我是 google 操作和 firebase 领域的新手,所以我真的只需要概述如何在我的操作中访问 firebase。如果你能提供,那就太棒了! 【参考方案1】:

由于您在 Firebase Functions 中运行,因此您不需要直接要求 @google-cloud/storage 依赖项。相反,您可以通过admin.storage()获得正确认证的存储组件

之后,您不应该将文件下载到您的函数中,因为您最好通过readStream 直接读取到内存中。

关于您现有的代码错误,可能是因为您在回调变量为errr时检查if (!err)

我过去做过这个,这里是我如何实现它的代码 sn-p。它是专门用 Typescript 编写的,但如果你直接使用它,我认为你应该能够将它移植到 JS。

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin'
import  Bucket  from '@google-cloud/storage';

admin.initializeApp()

const db = admin.firestore()

const bucket = admin.storage().bucket('project-id.appspot.com') // Use your project-id here.

const readFile = async (bucket: Bucket, fileName: string) => 
  const stream = bucket.file(fileName).createReadStream();
  return new Promise((resolve, reject) => 
    let buffer = '';
    stream.on('data', function(d: string) 
      buffer += d;
    ).on('end', function() 
      resolve(buffer)
    );
  )


app.handle('my-intent-handler', async (conv) => 
  const contents = await readArticle(bucket, 'filename.txt')
  conv.add(`Your content is $contents`)
)

exports.fulfillment = functions.https.onRequest(app)

【讨论】:

感谢您的帮助!我最终选择了一条更简单的不同路线,我将在下面发布答案! 如何使用firebase-admin上传文件? @ßãlãjî 你可能想参考我写的一篇关于这个主题的文章:fleker.medium.com/…

以上是关于带有 Google 操作的 Firebase 存储的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 存储的 OnSuccessListener 回调未调用

带有令牌的firebase google身份验证

如何从 Firebase 存储访问图像?

带有Firebase的Google App Engine-无法添加依赖项

将Firebase存储与Google云CDN集成

使用私有Google存储的Firebase iOS SDK身份验证