当前位置: 首页 > 知识库问答 >
问题:

如何访问节点上函数内部的Firebase存储。js服务器?

黄隐水
2023-03-14

我正在运行一个Firebase Functions实例,如下所示:

import * as functions from 'firebase-functions'
import * as express from 'express'
import * as admin from 'firebase-admin'
import { MyApi } from './server'

admin.initializeApp(functions.config().firebase)

const firebaseDb: admin.database.Database = admin.database()

const app: express.Application = MyApi.bootstrap(firebaseDb).app

export const myApp = functions.https.onRequest(app)

我的实时数据库一切正常,但我无法正确集成存储。根据文档,我需要这样设置:

var config = {
  apiKey: '<your-api-key>',
  authDomain: '<your-auth-domain>',
  databaseURL: '<your-database-url>',
  storageBucket: '<your-storage-bucket>'
};
firebase.initializeApp(config);

// Get a reference to the storage service, which is used to create references in your storage bucket
var storage = firebase.storage();
var storageRef = storage.ref();

然而,这对我不起作用,因为我使用的是管理SDK。我根本没有导入< code>firebase库。我尝试像这样访问存储:

const fbStorage = admin.storage()

这感觉不对。Admin存储方法的界面与Firebase客户端SDK的完全不同:

node_modules/firebase-admin/lib/index.d.ts

declare namespace admin.storage {
  interface Storage {
    app: admin.app.App;
    bucket(name?: string): Bucket;
  }
}

node_modules/firebase/index.d.ts

declare namespace firebase.storage {
  interface Storage {
    app: firebase.app.App;
    maxOperationRetryTime: number;
    maxUploadRetryTime: number;
    ref(path?: string): firebase.storage.Reference;
    refFromURL(url: string): firebase.storage.Reference;
    setMaxOperationRetryTime(time: number): any;
    setMaxUploadRetryTime(time: number): any;
  }

值得注意的是,管理存储接口缺少<code>ref()</code>和<code>ref()。put()方法,因此处理上传文件的文档都不适用。我可以通过<code>admin.storage()。

作为一种解决方法,我尝试在admin.initializeApp()之上初始化一个非管理员Firebase应用程序(firebase.initializeApp(config))。但是当我尝试启动给出致命错误的函数数据库:Firebase:名为“数据库”的Firebase服务已经注册(app/plicate-service)。

现在,我制作了一个单独的应用程序,并试图将存储功能委托给第二个应用程序。有没有更好的办法?

谢谢。

乌德帕特(回答):

多亏了Renaud的建议,我才知道我最初的尝试实际上是正确的。事实证明,您应该通过 admin.storage() 访问您的存储实例。接口定义确实不同,因为客户端 SDK 和 admin(服务器端)SDK 迎合了不同的需求。如果要包含类型定义,则需要从“@google云/存储”导入它们。

以下是如何基于官方文档使用Bucket API的示例:

import { Bucket } from '@google-cloud/storage'

const filename = 'path/to/myfile.mp3'

const bucket: Bucket = admin.storage().bucket()

bucket
  .upload(filename, {
    destination: 'audio/music/myfile.mp3',
  })
  .then(() => {
    console.log(`${filename} uploaded to ${bucket.name}.`)
  })
  .catch(err => {
    console.error('ERROR:', err)
  })

共有1个答案

岑叶秋
2023-03-14

(我希望我正确理解了您的问题)以下是一个如何从云函数访问云存储以流式传输文件的示例:

    const config = {
        projectId: '.....',
        keyFilename: './......json'
    };
    const storage = require('@google-cloud/storage')(config);
    const yourStorageBucket = 'xyz.appspot.com';


    const bucket = storage.bucket(yourStorageBucket);

    const file = bucket.file(filename);
    const stream = file.createWriteStream({resumable: false});
    ....

你可以在https://cloud . Google . com/nodejs/getting-started/using-cloud-storage # uploading _ to _ cloud _ storage和https://firebase . Google . com/docs/storage/extend-with-functions查看更多详情

 类似资料:
  • 问题内容: 我想知道如何访问另一个函数中的一个函数。我看到了这样的代码: 那么,还有另一种方法来调用该 函数吗?我的第二个问题是,为什么在最后一行中我不打电话? 很好的解释深表感谢。 问题答案: 不,您不能直接调用它,因为它是的局部变量。 您需要使用,因为调用时返回了函数对象。要执行此功能对象,您需要 在这里您可以直接调用它,因为您可以访问它,因为它是由函数返回的。返回的对象实际上称为 闭包, 因

  • 我正在尝试访问一个运行在Openshift吊舱中的Flask服务器。 为此,我创建了如下服务。 1)首先,我豆荚ping到另一个豆荚并得到响应。 但是,当我尝试时,它没有响应。 2) 之后,我尝试从一个pod访问集群IP。在这种情况下,都不可访问。 请告诉我哪里出错了。为什么上面的情况#1,#2失败。如何访问集群IP服务。 我对服务和访问服务完全陌生,因此我可能缺少一些基础知识。 我回答了其他问题

  • 我有一个Xperia Neo V没有任何内部存储--只有一个SD卡作为外部存储,而Galaxy S3有内部和外部存储。 使用此函数时只能访问内部存储(S3)上的文件,但Xperia Neo V没有问题。 如何访问内部和外部存储上的文件?

  • 我有两个不同的微服务,将尤里卡作为服务注册表,现在我正在尝试从另一个微服务调用微服务,解析带有功能区的endpoint以进行客户端负载平衡。 服务A: 此服务公开一个终结点,并且应用程序.yml 如下所示: 调用服务A的服务B具有以下应用程序类: 控制器 服务 但我在尝试访问服务时遇到了一个异常: 对此有什么建议吗?

  • 我试图在文件如下示例:如何为Firebase构建云函数,以便从多个文件部署多个函数?。 特别是,我有一个: 现在在index.ts我可以导入并附加一个用户身份验证侦听器,以便在创建新用户时触发,即: 然而,据我所知,只有实际上按预期工作,并且导出。userEvents似乎不会在创建新用户时触发。 ===================================================

  • 为了更清楚地说明,我明白最终必须有人被信任。例如,ops工程师可以拥有自己的凭据来访问Vault,并获得相同数据库的密码。这将允许用户访问,但不允许该用户模拟服务。是否有任何理由ops工程师也应该知道服务自己的凭据,以便在初始化后访问保险库?