JP *_*Lew 5 node.js google-cloud-storage firebase 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)
Run Code Online (Sandbox Code Playgroud)
我的实时数据库一切正常,但是我无法正确集成存储。根据文档,我需要像这样设置它:
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();
Run Code Online (Sandbox Code Playgroud)
但是,由于我使用的是Admin SDK,因此这对我不起作用。我根本不导入firebase库。我试图这样访问存储:
const fbStorage = admin.storage()
Run Code Online (Sandbox Code Playgroud)
这感觉不对。管理员存储方法的界面与Firebase客户端SDK的界面完全不同:
node_modules / firebase-admin / lib / index.d.ts
declare namespace admin.storage {
interface Storage {
app: admin.app.App;
bucket(name?: string): Bucket;
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
重要的是,管理存储界面缺少ref()和ref().put()方法,因此没有任何有关上载文件的文档适用。我可以通过来访问我的文件admin.storage().bucket().file('path/to/file.jpg'),但这似乎是回旋处,我不确定是否应该这样做。
解决方法是,我尝试firebase.initializeApp(config)在之上初始化非管理员Firebase应用()admin.initializeApp()。但是当我尝试启动给出致命错误的函数时database: Firebase: Firebase service named 'database' already registered (app/duplicate-service).
现在,我制作了一个单独的应用程序,并尝试将存储功能委派给该辅助应用程序。有没有更好的办法?
谢谢。
UDPATE(答案):
感谢Renaud的建议,我了解到我的最初尝试实际上是正确的尝试。原来您应该通过来访问您的存储实例admin.storage()。接口定义的确有所不同,因为客户端SDK和admin(服务器端)SDK可以满足不同的需求。如果要包括类型定义,则需要从“ @ google-cloud / storage”导入它们。
以下是根据官方文档介绍如何使用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)
})
Run Code Online (Sandbox Code Playgroud)
(我希望我正确理解了您的问题)以下是有关如何从云功能访问云存储以流式传输文件的示例:
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});
....
Run Code Online (Sandbox Code Playgroud)
您可以查看更多详细信息: https://cloud.google.com/nodejs/getting-started/using-cloud-storage#uploading_to_cloud_storage 和 https://firebase.google.com/docs/storage/extend-带功能
| 归档时间: |
|
| 查看次数: |
2880 次 |
| 最近记录: |