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存储引用?

       

网上收集的解决方案 "TypeError:firebase.storage不是一个函数"

根据这个答案 ,而不是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') 

另请查看文档了解更多。

一些细节要注意:

  1. Firebase存储不再与Node.js一起使用,所有文档对Node.js都没有用处。 而是使用google-cloud 。 Firebase和Google Cloud的参考资料和指南并没有反映到今天。
  2. 与Firebase不同,即使是小型项目,谷歌云也需要花费金钱。
  3. 在我的情况下,我使用的是firebase-admin SDK,所以我现在不用担心用户身份validation。

目的

创build一个使用Firebase和Google Cloud的Node.js项目。 为什么? 除了其他function外,Firebase还有一个有用的数据库,Google Cloud允许云文件存储和检索。

路线

第1步:项目创build

创buildFirebase和Google云(存储)项目。

第2步:安装软件包

使用npm ,在Node.js项目中安装firebase-admingoogle-cloud

注1:我使用了admin SDK,因此在创buildFirebase项目之后,您需要转到:

  • 设置(齿轮)> 项目设置 > 服务帐户 > Firebasepipe理SDK
  • 然后你:selectNode.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云端存储设置

  1. 滚动菜单(水平3格),点击“存储”,然后点击“启用计费”。 是的,您添加了结算信息,现在您需要为该项目的存储桶启用它。
  2. 应该看到,您的Firebase项目中应该已经存在一个存储分区。
  3. 再次点击菜单(3条图标),然后> IAM&pipe理 > 设置
  4. 在设置中,您会看到“项目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的存储时,您无法在免费层上添加存储区,这是正确的。 但是,默认情况下,你会得到一个桶(只有一个)。 我(最终)成功的做法是:

  1. 将存储添加到Firebase中的项目(不是Google Cloud)

  2. 根据Google文档添加Admin SDK并设置必要的服务帐户: https : //firebase.google.com/docs/admin/setup? aututser = 1

  3. 按照有关使用存储空间的Admin SDK的说明添加“@ google-cloud / storage”包: https : //firebase.google.com/docs/storage/admin/start?aututser = 1

  4. 初始化应用程序:

    admin.initializeApp({credential:admin.credential.cert(“/ path / to / generated / json / here.json”),storageBucket:“folder-URL-from-Storage-page-excluded-gs://”} );

  5. 使用(从Admin SDK文档)访问存储桶对象:

    const bucket = admin.storage()。bucket()

  6. 在存储库中操作存储桶。 例:

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

从文档看来,这似乎是一种替代方法。 我更喜欢这个,因为这将存储链接到应用程序,使代码更易读,更实用