TypeError:firebase.storage不是函数

时间:2016-12-27 20:59:05

标签: javascript node.js firebase firebase-storage

按照this示例,我不断收到错误:

 TypeError: firebase.storage is not a function

从我的代码中的这一行:

var storageRef = firebase.storage().ref();

(当我尝试初始化来自storage guidefirebase's npm site的存储空间时,我会收到同样的错误。)

在我的Node.js项目中,我包括以下库:

  • const firebase = require('firebase');
  • var admin = require('firebase-admin');
  • const fs = require('fs');

到目前为止,我已成功读取并写入firebase数据库,使用var db = admin.database()创建对数据库的引用,然后var ref = db.ref("/") ...所以我知道我已正确配置Firebase和firebase-database。但我仍然坚持storage,并尝试使用相同的错误消息admin.storage().ref()firebase.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

如何成功创建存储参考?

15 个答案:

答案 0 :(得分:23)

已弃用,见下文:

根据this answer,在Node.js中,应使用google-cloud包存储,而不是firebase存储,this answer似乎应该确认它。代码示例:

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

截至2018年,这是正确答案:

或仅使用包裹的存储部分:

npm install --save @google-cloud/storage

然后:

var storage = require('@google-cloud/storage')

另请查看the docs了解更多信息。

答案 1 :(得分:17)

需要注意的一些细节:

  1. Firebase存储不再与Node.js一起使用,因此所有文档对Node.js都没用。而是使用google-cloud。 Firebase和Google Cloud的参考和指南截至目前尚未反映这一点。
  2. 与Firebase不同,即使是小型项目,google-cloud也要花钱。
  3. 就我而言,我使用的是firebase-admin SDK,因此我现在不必弄乱用户身份验证。
  4. 目的

    创建一个使用Firebase和Google Cloud的Node.js项目。 为什么? Firebase拥有一个有用的数据库,以及其他功能,而Google Cloud允许云文件存储和检索。

    路线

    第1步:项目创建

    创建FirebaseGoogle Cloud (Storage)项目。

    第2步:安装包

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

    注1:我使用了管理员SDK,因此在创建Firebase项目后,您需要转到:

    • 设置(齿轮)&gt; 项目设置&gt; 服务帐户&gt; Firebase管理SDK
    • 然后你:选择Node.js&gt; [将生成的代码复制/粘贴到 你的项目]&gt; [点击&#34;生成新私钥&#34;]&gt; [下载 生成json到首选位置]&gt; [更换 "path/to...AccountKey.json"以及您刚刚获得密钥的路径 产生

    注意2:生成的密钥可以在firebase或google-cloud凭据中重复使用。

    第3步:Firebase设置

    创建项目后,导入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"
    });
    

    要查找databaseURL,请转到&#39;存储&#39;在Firebase中,记下以gs:开头的网址,然后将其复制/粘贴到databaseURL的值字段中。

    接下来,获取对您可以使用的数据库的引用:

    var db = admin.database();
    var ref = db.ref("/");
    console.log('DB ref: ' + ref); //just to debug, if undefined, there's a problem.
    

    要了解有关阅读/写入数据库的更多信息,请按照Firebase's own documentation

    第4步:Google云计费设置

    在Google Cloud上创建项目后,添加结算信息;如果没有结算信息,则无法使用存储桶。

    第5步:Google云存储设置

    1. 滚动菜单(水平3条),点击&#34;存储&#34;,然后&#34;启用结算&#34;。是的,您添加了结算信息,现在您需要为该项目的存储桶启用它。
    2. 应该看到您的Firebase项目中已存在一个存储桶。
    3. 再次点击菜单(3栏图标),然后点击> IAM&amp;管理员&gt; 设置
    4. 在设置中,您会看到&#34;项目ID&#34;它应该看起来像&#34; projectName-00000&#34;或&#34; projectName-一些#&#34;,复制该项目ID
    5. 第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步:验证

      如果文件在Firebase存储和Google云端存储中可见,您就完成了!

答案 2 :(得分:10)

我遇到了同样的问题。就我而言,除了Firebase核心之外,我还需要包含存储模块。

boxplot.stats()

(npm firebase v5.0.4)

答案 3 :(得分:6)

2020年答案,就我而言,我在.html文件中包含firebase-storage.js

<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-storage.js"></script>  

因此,如果您使用所有Firebase服务,您将拥有

<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-firestore.js"></script>  
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-messaging.js"></script>  
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-storage.js"></script>  


<!-- your script calling Firebase Firestore under this line -->
<script> 
....
</script>

答案 4 :(得分:5)

使用Storage with Firebase时,您无法在免费套餐上添加存储桶。但是,默认情况下,您会获得一个存储桶(只有一个)。我(最终)成功的方法是:

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

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

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

  4. 初始化应用:

    admin.initializeApp({
      credential: admin.credential.cert("/path/to/generated/json/here.json"),
      storageBucket: "folder-URL-from-Storage-page-excluding-gs://"
    });
    
  5. 使用(来自Admin SDK文档)访问存储桶对象:

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

  6. 使用存储库在存储桶上运行。示例:

    bucket.upload('/path/file.ext', function(err, file, apiResponse) {
      //Do Stuff
    });
    
  7. 注意:我花了几个小时确信它没有工作,因为我没有存储桶,但事实证明我的错误是在初始化时将gs://包含在存储桶的路径中。

答案 5 :(得分:4)

确保在HTML文件中添加了带有此src的脚本标签 转到您的项目

  • 此处 7.12.0 将替换为您当前的工作版本。

答案 6 :(得分:2)

我遇到了同样的问题,我的代码如下:

import * as firebase from "firebase/app";
import 'firebase/storage';

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();

所以,我发现只有当您使用 Typescript 时,这种方式才会出现。

如果仅使用 ES6 ,则必须具有:

import firebase from 'firebase/app';
import 'firebase/storage';

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref(); 

如果使用 ES5 ,则必须具有:

var firebase = require("firebase/app");
require("firebase/storage");

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();

此外,您还可以使用以下方式,但是不建议您这样做,因为您会加载所有服务(数据库,身份验证,存储等):

import firebase from "firebase";

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();

经过Firebase 7.15.2测试

答案 7 :(得分:1)

在本地测试我的应用程序时遇到相同的问题,但是在部署项目时一切正常

这样,我实际上使用以下解决方法:

if (!firebase.storage) {
    // prevent crash when working locally
    return;
}
let ref = firebase.storage().ref()
// perform production stuff ...

这有点好奇,但是对于我来说还是可以的。

答案 8 :(得分:0)

如果您尝试按以下方式执行此操作,是否会发生变化?

// Initialize the default app:
const app = firebase.initializeApp(appConfig)

// Initialize storage from the *app* object:
const storage = app.storage()

the docs开始,这似乎是另一种方法。我更喜欢这个,因为它将存储链接到应用程序,使代码更具可读性和功能性

答案 9 :(得分:0)

看起来他们已经在新版本的库中修复了它。 只需在相关软件包上运行npm update即可。

答案 10 :(得分:0)

firebase存储服务在浏览器中仍然有效(并且不建议使用AFAIK)。 firebase存储服务在服务器环境中不可用,包括在服务器端渲染期间。

这是我的操作方式:

df_new_STACK

然后在// only import uploadHandler client-side. const uploadHandler = typeof window === 'object' ? require('./handlers').imageHandler : () => false; // ssr only 中,您可以安全地正常使用Firebase存储服务。

handlers.js

截至2020年4月3日,似乎整个firebase产品套件仍在浏览器环境中受支持。

firebase environment support table

来源:https://firebase.google.com/docs/web/setup#namespace

答案 11 :(得分:0)

我能够使用firebase.storage(),但花了一些时间才弄清楚。仅在这样导入时有效:

//Importing
const firebase = require('firebase')
require('firebase/storage')

//Calling the function (You can call it normally then)
const storageRef = firebase.storage().ref();

我很认真,每当尝试导入为firebase.storage()或进行其他任何操作均无法正常工作时!希望对您有所帮助。

答案 12 :(得分:0)

当我在浏览器(webapp)中集成Firebase的存储时遇到了类似的问题

  <script src="https://www.gstatic.com/firebasejs/7.15.0/firebase-storage.js"></script>

只需添加该行,该错误就消失了!

答案 13 :(得分:0)

在 app.module 中初始化 50% completed ... ; import firebase from 'firebase/app';

import 'firebase/storage'

答案 14 :(得分:-1)

从“ firebase / app”中导入*作为firebase;

然后firebase.storage()。ref()应该可以工作。

希望这会有所帮助。