类型错误:firebase.storage 不是函数

IT技术 javascript node.js firebase firebase-storage
2021-02-23 07:35:11

按照这个例子,我不断收到错误:

 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(),然后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();

和 withref()的无效参数()和 with "/"... 但有相同的信息,但无济于事。

我正在使用:

  • "firebase": "^3.6.4"
  • “firebase-admin”:“^4.0.4”
  • Node.js:v6.9.1

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

6个回答

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

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

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

(npm firebase v5.0.4)

感谢您的反馈,我发现我得到 'firebase' 没有导出成员 'storage' 与 firebase.storage().ref()
2021-04-17 07:35:11

已弃用,见下文:

根据这个答案,在 Node.js 中,google-cloud应该使用包存储而不是 firebase 存储,看来这个答案应该证实了这一点。代码示例:

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

另请查看文档以获取更多信息。

这怎么算正确答案?它没有被弃用:firebase.google.com/docs/storage/web/start
2021-04-17 07:35:11
谢谢!我希望这是一种绕过计费的方法 =\
2021-05-01 07:35:11
刚刚发现一个主要的未公开的障碍......你必须启用计费才能使用存储桶😑
2021-05-04 07:35:11
更正,此处更新的答案不起作用,它也已弃用。
2021-05-06 07:35:11
已经遇到警告......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.所以我会发布这个以保持信息最新......现在解决这个问题,感谢第二个答案......
2021-05-08 07:35:11

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

一些需要注意的细节:

  1. Firebase 存储不再与 Node.js 一起使用,因此所有文档对 Node.js 都没有用。相反,使用google-cloud. 到目前为止,Firebase 和 Google Cloud 的参考和指南并未反映这一点。
  2. 与 Firebase 不同,google-cloud 需要花钱,即使是小型项目也是如此。
  3. 就我而言,我使用的是firebase-adminSDK,因此我目前不必处理用户身份验证。

目的

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

路线

第 1 步:项目创建

创建FirebaseGoogle Cloud(存储)项目。

第 2 步:安装软件包

使用npm,安装firebase-admingoogle-cloudNode.js项目中。

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

  • 设置(齿轮)>项目设置>服务帐户> Firebase Admin SDK
  • 然后您:选择Node.js> [将生成的代码复制/粘贴到您的项目中] > [单击“生成新的私钥”] > [将生成的下载json到首选位置] > [替换 "path/to...AccountKey.json"为您刚刚生成的密钥的路径]

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

第 3 步:Firebase 设置

创建项目后,导入firebase-adminsdk:

代码应如下所示,但填充了您的信息:

var admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert("/path/to/generated/json/here.json"),
  databaseURL: "database-url-from-firebase"
});

要查找 databaseURL,请转到 Firebase 中的“存储”,并记下以开头的 URLgs:并将其复制/粘贴到 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-Cloud 计费设置

在谷歌云上创建项目后,添加账单信息;如果没有帐单信息,则无法使用存储桶。

第 5 步:Google-Cloud Storage 设置

  1. 滚动菜单(水平 3 条),单击“存储”,然后单击“启用计费”。是的,您添加了账单信息,现在您需要为该项目的存储桶启用它。
  2. 应该会看到您的 Firebase 项目中应该已经存在一个存储桶。
  3. 再次单击菜单(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 中可见,那么您就大功告成了!

在所有这些过程中,您如何验证用户并为他提供文件?
2021-04-17 07:35:11
如果你因为这对你来说不是一个好的答案而投反对票......那么请参考我的答案中的第一行,它将用户重定向到正确的答案。我将这个答案保留在这里以供后代使用。
2021-04-23 07:35:11
更新的答案也已过时,因为“npm WARN deprecated google-cloud@0.58.2: The google-cloud package has been deprecated”。不过别难过,看来google自己的文档更过时了。
2021-05-09 07:35:11

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>
请参阅此链接以获取更新和可用的库:firebase.google.com/docs/web/setup#expandable-8
2021-05-03 07:35:11

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

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