node.js - 如何访问 Node.js 服务器上 Functions 内部的 Firebase 存储?

标签 node.js firebase google-cloud-storage google-cloud-functions firebase-storage

我正在运行一个 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)

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

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();

但是这对我不起作用,因为我使用的是 Admin SDK。我根本没有导入 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;
  }

值得注意的是,管理存储接口(interface)缺少 ref()ref().put() 方法,因此处理上传文件的文档都不适用。我可以通过 admin.storage().bucket().file('path/to/file.jpg') 访问我的文件,但这似乎很迂回,我不确定我是否应该这样做。

作为解决方法,我尝试在 admin.initializeApp() 之上初始化一个非管理员 Firebase 应用程序 (firebase.initializeApp(config))。但是当我尝试启动出现 fatal error 的函数时 database: Firebase: Firebase service named 'database' already registered (app/duplicate-service).

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

谢谢。


UDPATE(答案):

感谢 Renaud 的建议,我了解到我最初的尝试实际上是正确的。结果表明您应该通过 admin.storage() 访问您的 Storage 实例。接口(interface)定义确实不同,因为客户端 SDK 和管理(服务器端)SDK 满足不同的需求。如果要包含类型定义,则需要从“@google-cloud/storage”导入它们。

以下是如何使用基于 the official docs 的 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)
  })

最佳答案

(我希望我理解正确你的问题)这是一个关于如何从云功能访问云存储以流式传输文件的示例:

    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_storagehttps://firebase.google.com/docs/storage/extend-with-functions

关于node.js - 如何访问 Node.js 服务器上 Functions 内部的 Firebase 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49218412/

相关文章:

node.js - 使用 npm serve 的位置代理

Firebase 服务器时间戳与本地(几乎)相同

android - 是否需要在 android list 中设置最大值?

java - 无法在 Firebase、Android 上获取值

node.js - package.json 在 azure 上失败并出现错误 Windows_NT 6.2.9200

javascript - NodeJS、AngularJS - 在服务器中发布事件并监听

javascript - NodeJS 验证和循环中的多次插入

google-app-engine - 谷歌云节点安装第三方库 Node.js

node.js - 使用 Node.js 客户端在 gcloud 存储中创建和共享存储桶

google-cloud-storage - 名称为 “/”的Google存储API列表存储桶