【问题标题】:TypeError: firebase.storage is not a function类型错误:firebase.storage 不是函数
【发布时间】:2017-05-12 03:39:33
【问题描述】:

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

 TypeError: firebase.storage is not a function

从我的代码中的这一行开始:

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

(当我尝试从storage guide 初始化存储时,从firebase'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() 的 void 参数 ()"/"... 但有相同的消息,但无济于事。

我正在使用:

  • “火力基地”:“^3.6.4”
  • “firebase-admin”:“^4.0.4”
  • Node.js : v6.9.1

我必须做什么才能成功创建对存储的引用?

【问题讨论】:

  • @SergChernata 不,这完全是一个不同的错误。 “Firebase is not a function。他们的错误是他们没有正确初始化 Firebase,而我做到了,并且能够相应地利用 Firebase 数据库和其他功能。Firebase 存储是问题所在。
  • 检查firebase.storage 对象时看到了什么?尝试执行 console.log(JSON.stringify(firebase.storage))。是未定义的吗?
  • 是的,它是未定义的;尽管 JSON 指向正确的 URL,我只是仔细检查了。

标签: javascript node.js firebase firebase-storage


【解决方案1】:

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

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

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

(npm firebase v5.0.4)

【讨论】:

  • 感谢您的反馈,我发现'firebase' has no export member 'storage' with firebase.storage().ref()
【解决方案2】:

已弃用,见下文:

根据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 了解更多信息。

【讨论】:

  • 已经遇到警告...npm WARN deprecated gcloud@0.37.0: gcloud has been renamed to google-cloud. To get new features and bug fixes, you must use the new package....所以我会发布这个以保持信息最新...现在通过这个,感谢第二个答案...
  • 刚刚发现了一个未公开的重大障碍...您必须启用计费才能使用存储桶?
  • 谢谢!我希望这是一种绕过计费的方法=\
  • 正确答案如何?它没有被弃用:firebase.google.com/docs/storage/web/start
  • 更正,这里更新的答案不起作用,它也被弃用了。
【解决方案3】:

已弃用:请参阅已接受的答案。

需要注意的一些细节:

  1. Firebase 存储不再与 Node.js 一起使用,因此那里的所有文档都对 Node.js 毫无用处。相反,请使用google-cloud。到目前为止,Firebase 和 Google Cloud 的参考资料和指南并未反映这一点。
  2. 与 Firebase 不同,谷歌云需要花钱,即使是小型项目也是如此。
  3. 就我而言,我使用的是firebase-admin SDK,因此我现在不必搞乱用户身份验证。

目的

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

方向

第 1 步:创建项目

创建FirebaseGoogle Cloud (Storage) 项目。

第 2 步:安装软件包

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

注意 1:我使用的是 admin SDK,所以在创建 Firebase 项目后,您需要转到:

  • 设置(齿轮)> 项目设置 > 服务帐户 > Firebase Admin SDK
  • 然后你:选择Node.js > [将生成的代码复制/粘贴到 您的项目] > [单击“生成新私钥”] > [下载 生成json 到首选位置] > [替换 "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,请转到 Firebase 中的“Storage”,记下以 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's own documentation

第 4 步:Google-Cloud 结算设置

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

第 5 步:谷歌云存储设置

  1. 滚动菜单(水平 3 条),单击“存储”,然后单击“启用计费”。是的,您添加了结算信息,现在您需要为该项目的存储桶启用它。
  2. 应该看到您的 Firebase 项目中应该已经存在一个存储桶。
  3. 再次点击菜单(三栏图标),然后 > IAM 和管理员 > 设置
  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 步:验证

如果文件在 Firebase Storage 和 Google Cloud Storage 中可见,则说明大功告成!

【讨论】:

  • 在这一切过程中,您如何验证用户身份并为他提供文件?
  • 如果您因为这对您来说不是一个好的答案而投反对票......那么请参考我的答案中的第一行,它将用户重定向到正确的答案。我将这个答案留在这里以供后代使用。
  • 更新后的答案也已过时,因为“npm WARN deprecated google-cloud@0.58.2: The google-cloud package has been deprecated.”不过别心疼,看来google自己的文档更过时了。
【解决方案4】:

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

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

【讨论】:

【解决方案5】:

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

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 测试

【讨论】:

    【解决方案6】:

    将 Storage 与 Firebase 结合使用时,您不能在免费层级上添加存储分区是正确的。但是,默认情况下你会得到一个桶(只有一个)。我(最终)成功的方法是:

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

    2. 添加 Admin SDK 并根据 Google 文档设置必要的服务帐户: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
      });
      

    注意:我花了几个小时确信它不起作用,因为我没有存储桶,但事实证明我的错误是在初始化时将gs:// 包含在存储桶的路径中。

    【讨论】:

    • 我收到错误“TypeError: admin.storage is not a function”
    • Tushar 创建一个没有安全证书的应用程序。摩根,谢谢。这是正确的答案。如果您在本地没有文件(例如用户需要上传头像或其他内容),我会补充说 .save() 适用于缓冲区。
    • 对于任何想要获取公共网址的人:bucket.file('image.jpg').getSignedUrl({ action: 'read', expires: '03-09-2491' }).then(results =&gt; { let url = results[0]; }); 您还可以在此处找到详细信息:stackoverflow.com/questions/42956250/…github.com/googleapis/nodejs-storage/blob/master/samples/…
    • 我有一个问题,这工作正常let bucket = admin.storage().bucket() 但我在存储users/ 中有一个文件夹,在这个文件夹中我正在存储图像。我怎样才能访问这个文件夹??
    【解决方案7】:

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

    • 这里 7.12.0 将替换为您当前的工作版本。

    【讨论】:

      【解决方案8】:

      我能够使用 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() 或做任何不同的事情都行不通!希望对大家有所帮助。

      【讨论】:

      • 这是唯一对我有用且不会增加大量复杂性的选项。
      【解决方案9】:

      在 app.module 中初始化 import firebase from 'firebase/app'; import 'firebase/storage';

      firebase.storage();

      【讨论】:

        【解决方案10】:

        如果您尝试如下操作,它会改变吗?

        // Initialize the default app:
        const app = firebase.initializeApp(appConfig)
        
        // Initialize storage from the *app* object:
        const storage = app.storage()
        

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

        【讨论】:

        • 没有变化...除非有新的错误计数...在线上,var storage = app.storage(); 我收到此错误:TypeError: app.storage is not a function...我确实这样做了:var app = firebase.initializeApp(config); 之前.
        • 我知道这不起作用,我会添加第二个答案,以便更好地尝试。也就是说,我将把这个留给可能会在这里找到自己的潜在网络编码谷歌用户。 :)
        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

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

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

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

          这有点奇怪,但它适用于我的情况。

          【讨论】:

          • 这很有趣!就我而言,我的应用程序也已部署,所以有趣的是这对您有用,但对我无效。我的工作是使用 Google Cloud 存储
          【解决方案13】:

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

          这就是我的做法:

          // only import uploadHandler client-side.
          const uploadHandler = typeof window === 'object' ? require('./handlers').imageHandler : () => false; // ssr only
          

          那么在handlers.js你就可以安全的正常使用firebase存储服务了。

          import * as firebase from 'firebase'
          const storageRef = firebase.storage().ref();
          const bucketObjectRef = storageRef.child('myFile.jpg');
          

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

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

          【讨论】:

            【解决方案14】:

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

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

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

            【讨论】:

              【解决方案15】:

              从 'firebase/app' 导入 * 作为 firebase;

              那么 firebase.storage().ref() 应该可以工作了。

              希望这会有所帮助。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-08-02
                • 2019-09-27
                • 2018-07-22
                • 2016-02-26
                • 2013-04-01
                • 2016-03-06
                相关资源
                最近更新 更多