TypeError:firebase.storage不是函数

Non*_*714 38 javascript node.js firebase firebase-storage

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

 TypeError: firebase.storage is not a function
Run Code Online (Sandbox Code Playgroud)

从我的代码中的这一行:

var storageRef = firebase.storage().ref();
Run Code Online (Sandbox Code Playgroud)

(当我只是尝试从存储指南初始化存储时,从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();
Run Code Online (Sandbox Code Playgroud)

const app = firebase.initializeApp(config);
var storage = app.storage();
Run Code Online (Sandbox Code Playgroud)

ref()'s无效的论点()"/"...但有相同的信息,但无济于事.

我正在使用:

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

如何成功创建存储参考?

Sel*_*ish 26

弃用,见下文:

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

npm i --save google-cloud
Run Code Online (Sandbox Code Playgroud)

然后:

const gcloud = require('google-cloud')

const storage = gcloud.storage({
    projectId: '<projectID>',
    keyFilename: 'service-account-credentials.json',
});

const bucket = storage.bucket('<projectID>.appspot.com')
Run Code Online (Sandbox Code Playgroud)

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

或仅使用包的存储部分:

npm install --save @google-cloud/storage
Run Code Online (Sandbox Code Playgroud)

然后:

var storage = require('@google-cloud/storage')
Run Code Online (Sandbox Code Playgroud)

另请查看文档了解更多信息.

  • 已经发出警告......`npm WARN弃用了gcloud@0.37.0:gcloud已经重命名为google-cloud.要获得新功能和错误修复,您必须使用新包....所以我会发布这个以保持信息最新...现在正在解决这个问题,感谢第二个答案...... (3认同)
  • 更正,这里更新的答案不起作用,它也已被弃用。 (3认同)
  • 这怎么是正确答案呢?它没有被弃用:https://firebase.google.com/docs/storage/web/start (2认同)

Gin*_*pei 22

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

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

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();
Run Code Online (Sandbox Code Playgroud)

(npm firebase v5.0.4)

  • 感谢您的反馈,我发现我得到 'firebase' 没有导出成员 'storage' 与 firebase.storage().ref() (2认同)

Non*_*714 18

一些细节需要注意:

  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:我使用了管理员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"
});
Run Code Online (Sandbox Code Playgroud)

要查找databaseURL,请转到Firebase中的"存储",并记下以URL开头的URL,gs:然后将其复制/粘贴到databaseURL的值字段中.

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

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

要了解有关读取/写入数据库的更多信息,请按照Firebase自己的文档进行操作.

第4步:Google云计费设置

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

第5步:Google云存储设置

  1. 滚动菜单(水平3条),点击"存储",然后点击"启用结算".是的,您添加了计费信息,现在您需要为该项目的存储桶启用它.
  2. 应该会看到Firebase项目中已存在存储桶.
  3. 再次单击菜单(3栏图标),然后> IAM和管理员 > 设置
  4. 在设置中,您将看到"Project 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'
});
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过以下方式将文件发送到存储:

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

第7步:验证

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


Moo*_*Moo 8

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

<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-storage.js"></script>  
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用所有 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>
Run Code Online (Sandbox Code Playgroud)


Iva*_*era 6

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

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

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();
Run Code Online (Sandbox Code Playgroud)

所以,我发现只有当你使用Typescript 时才会这样做

如果您只使用ES6,那么您必须:

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

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref(); 
Run Code Online (Sandbox Code Playgroud)

如果你使用ES5,那么你必须:

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

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();
Run Code Online (Sandbox Code Playgroud)

此外,您也可以使用以下方式,但不推荐使用,因为您加载了所有服务(数据库、身份验证、存储等):

import firebase from "firebase";

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();
Run Code Online (Sandbox Code Playgroud)

使用 Firebase 7.15.2 测试


小智 5

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

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

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

  3. @google-cloud/storage按照使用Admin SDK和存储的说明添加软件包: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://"
    });
    
    Run Code Online (Sandbox Code Playgroud)
  5. 使用(来自Admin SDK文档)访问存储桶对象:

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

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

    bucket.upload('/path/file.ext', function(err, file, apiResponse) {
      //Do Stuff
    });
    
    Run Code Online (Sandbox Code Playgroud)

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