TypeError:firebase.storage不是一个函数
遵循这个例子,我不断收到错误:
TypeError: firebase.storage is not a function
从我的代码中的这一行:
var storageRef = firebase.storage().ref();
(当我只是尝试从存储指南初始化存储,从firebase的npm站点链接,我得到同样的错误。)
在我的Node.js项目中,我包括以下库:
-
const firebase = require('firebase');
-
var admin = require('firebase-admin');
-
const fs = require('fs');
到目前为止,我已经成功地读取和写入了firebase数据库,使用var db = admin.database()
创build对数据库的引用,然后var ref = db.ref("/")
。所以我知道我已经正确地configuration了Firebase和firebase-database。 但是我卡在storage
,并尝试使用相同的错误信息admin.storage().ref()
和admin.storage().ref()
和admin.storage().ref()
firebase.storage().ref("/")
。
我也试过:
var storage = firbase.storage(); var storageRef = storage.ref();
和
const app = firebase.initializeApp(config); var storage = app.storage();
和ref()
的无效参数()
和"/"
…但有相同的信息,但无济于事。
我在用着:
- “firebase”:“^ 3.6.4”
- “firebase-admin”:“^ 4.0.4”
- Node.js:v6.9.1
我必须做什么才能成功创build存储引用?
根据这个答案 ,而不是firebase存储,在Node.js中,应该使用google-cloud
包存储,似乎这个答案应该确认它。 代码示例:
npm i --save google-cloud
然后:
const gcloud = require('google-cloud') const storage = gcloud.storage({ projectId: '<projectID>', keyFilename: 'service-account-credentials.json', }); const bucket = storage.bucket('<projectID>.appspot.com')
或者只使用软件包的存储部分:
npm install --save @google-cloud/storage
接着:
var storage = require('@google-cloud/storage')
另请查看文档了解更多。
一些细节要注意:
- Firebase存储不再与Node.js一起使用,所有文档对Node.js都没有用处。 而是使用
google-cloud
。 Firebase和Google Cloud的参考资料和指南并没有反映到今天。 - 与Firebase不同,即使是小型项目,谷歌云也需要花费金钱。
- 在我的情况下,我使用的是
firebase-admin
SDK,所以我现在不用担心用户身份validation。
目的
创build一个使用Firebase和Google Cloud的Node.js项目。 为什么? 除了其他function外,Firebase还有一个有用的数据库,Google Cloud允许云文件存储和检索。
路线
第1步:项目创build
创buildFirebase和Google云(存储)项目。
第2步:安装软件包
使用npm ,在Node.js
项目中安装firebase-admin
和google-cloud
。
注1:我使用了admin SDK,因此在创buildFirebase项目之后,您需要转到:
- 设置(齿轮)> 项目设置 > 服务帐户 > Firebasepipe理SDK
- 然后你:select
Node.js
> [复制/粘贴生成的代码到你的项目]> [点击“生成新的私钥”]> [下载生成的json
到首选位置]> [replace"path/to...AccountKey.json"
与你刚刚生成的密钥的path]
注2:生成的密钥可以在Firebase或Google云凭证中重复使用。
第3步:Firebase设置
一旦你的项目被创build,导入firebase-admin
sdk:
代码应该看起来像这样,但充满了你的信息:
var admin = require("firebase-admin"); admin.initializeApp({ credential: admin.credential.cert("/path/to/generated/json/here.json"), databaseURL: "database-url-from-firebase" });
要finddatabaseURL,请转到Firebase中的“存储”,然后记下以gs:
开头的url,并复制/粘贴databaseURL的值字段。
接下来,获取可以使用的数据库的引用:
var db = admin.database(); var ref = db.ref("/"); console.log('DB ref: ' + ref); //just to debug, if undefined, there's a problem.
要详细了解如何读取/写入数据库,请遵循Firebase自己的文档 。
第4步:Google云帐单设置
在Google Cloud上创build项目后,添加帐单信息; 没有记帐信息,桶不能使用。
第5步:Google云端存储设置
- 滚动菜单(水平3格),点击“存储”,然后点击“启用计费”。 是的,您添加了结算信息,现在您需要为该项目的存储桶启用它。
- 您应该看到,您的Firebase项目中应该已经存在一个存储分区。
- 再次点击菜单(3条图标),然后> IAM&pipe理 > 设置
- 在设置中,您会看到“项目ID”应该看起来像“projectName-00000”或“projectName-Some#”, 复制项目ID
第6步:在Node.js中使用Google Cloud
在你的index.js
:
var gcloud = require('google-cloud'); var gcs = gcloud.storage({ projectId: 'paste-that-project-id-here', keyFilename: 'paste-that-path-to-the-previously-downloaded-json-from-firebase-here' });
现在您可以通过以下方式将文件发送到您的存储:
var bucket = gcs.bucket('bucket_name'); var remoteFile = bucket.file('somefile-inThisCaseASong.mp3'); var localFilename = '/Users/you/Music/somefile-inThisCaseASong.mp3'; bucket.upload(localFilename, function(err, file) { if (!err) { console.log('somefile-inThisCaseASong.mp3 is now in your bucket.'); } else { console.log('Error uploading file: ' + err); } });
第7步:validation
如果该文件在Firebase存储和Google云端存储中可见,则表示已完成!
在使用带有Firebase的存储时,您无法在免费层上添加存储区,这是正确的。 但是,默认情况下,你会得到一个桶(只有一个)。 我(最终)成功的做法是:
-
将存储添加到Firebase中的项目(不是Google Cloud)
-
根据Google文档添加Admin SDK并设置必要的服务帐户: https : //firebase.google.com/docs/admin/setup? aututser = 1
-
按照有关使用存储空间的Admin SDK的说明添加“@ google-cloud / storage”包: https : //firebase.google.com/docs/storage/admin/start?aututser = 1
-
初始化应用程序:
admin.initializeApp({credential:admin.credential.cert(“/ path / to / generated / json / here.json”),storageBucket:“folder-URL-from-Storage-page-excluded-gs://”} );
-
使用(从Admin SDK文档)访问存储桶对象:
const bucket = admin.storage()。bucket()
-
在存储库中操作存储桶。 例:
bucket.upload('/ path / file.ext',function(err,file,apiResponse){// Do Stuff});
注意:我花了几个小时确信它没有工作,因为我没有一个桶,但事实certificate我的错误是在初始化时在我的存储桶的path中包含“gs://”。
如果你尝试像下面这样做,它会改变吗?
// Initialize the default app: const app = firebase.initializeApp(appConfig) // Initialize storage from the *app* object: const storage = app.storage()
从文档看来,这似乎是一种替代方法。 我更喜欢这个,因为这将存储链接到应用程序,使代码更易读,更实用
- 在NodeJS应用程序中提交firebase文件的做法是什么?
- Javascript:将对象的对象转换为对象数组
- 如何在Heroku的Node.js应用程序中从子文件夹redirect到静态JavaScript应用程序?
- 如何使用.push()添加数据后查询Firebase数据?
- 我们如何在node.js中使用Firebase Auth创build用户?
- 在Firebase云端函数中使用toLocaleString格式化货币值
- 如何发送消息到多个Android设备在Node js中使用FCM?
- Firebase createUserWithEmailAndPassword方法在node.js中未定义
- Firebase凭据错误