如何从客户端React应用程序使用Firebase存储?

时间:2018-07-07 05:57:39

标签: javascript reactjs firebase google-cloud-storage create-react-app

我正在尝试从我的React应用程序中将文件写入云存储。我使用create-react-app工具创建了一个新的React应用。我相信我已经按照正确的说明获取了存储引用,并带有如下代码:this.storage = firebase.storage();。但是,无论我如何配置firebase和导入什么,我都会看到此错误:TypeError: _this.firebase.storage() is not a function.

我尝试导入@firebase/storage(在此处注释),但是这会导致错误,并且该模块的NPM页面表明这不是用户应该直接加载的东西。

我相信我添加了正确的firebase库。我可以使用firestore和旧版数据库(我删除了代码来做到这一点,但是如果我使用类似this.firestore = this.firebase.firestore();的话,它可以工作)。但是,存储空间尚未解决。

对于是否应该使用客户端库进行云存储,我还不清楚(我相信这与Firebase的“存储”完全一样)。但是,所有示例似乎都是用于从NodeJS应用程序访问存储,并且我想从浏览器上下文中将文件编写为客户端JavaScript。

我的package.json看起来像这样:

{
  "name": "my-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@firebase/app": "^0.3.2",
    "@firebase/auth": "^0.5.2",
    "@firebase/firestore": "^0.5.6",
    "@material-ui/core": "^1.3.1",
    "@material-ui/icons": "^1.1.0",
    "enzyme": "^3.3.0",
    "enzyme-adapter-react-16": "^1.1.1",
    "react": "^16.4.1",
    "react-dom": "^16.4.1"
  },
  "scripts": {
    "start": "PORT=3009 react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

我的index.js如下:

import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import firebase from '@firebase/app';
import '@firebase/firestore';
import '@firebase/auth';
//import '@firebase/storage';                                                                                                                  

var config = {
    apiKey: "ABCDEFG",
    authDomain: "abcdefg.firebaseapp.com",
    databaseURL: "https://abcdefg.firebaseio.com",
    projectId: "abcdefg",
    storageBucket: "abcdefg.appspot.com",
    messagingSenderId: "12345"
};

firebase.initializeApp(config);

class Index extends Component {

    constructor(props) {
        super(props);
        this.state = {};
        this.firebase = firebase;
        this.firestore = this.firebase.firestore(); // This works fine.
        this.storage = this.firebase.storage(); // This fails
        console.log( "Got storage ref" );
    }

    render() {
        return (
            <div>
                Hello
            </div>
        )
    }
}

ReactDOM.render(
        <Index/>,
    document.getElementById('react-container')
);

firebase配置是从Firebase控制台复制的(但此处已更改)。

2 个答案:

答案 0 :(得分:3)

这有效:$ npm i @firebase/storage --save

这当前在"@firebase/storage": "^0.2.3"内的package.json中产生。

如果有的话,我可以在firebaseConfig.js文件中使用类似的代码来设置Firebase内部的存储空间:

import firebase from '@firebase/app';
import '@firebase/firestore';
import '@firebase/auth';
import '@firebase/storage';

然后像这样的代码起作用:

const storage = firebase.storage();
const files = [ 'image1.png', 'image2.png' ]; 
files.map( filename => {
    storage
      .ref( `/covers/${filename}` )
      .getDownloadURL()
      .then( url => {
        console.log( "Got download url: ", url );
      });
});

答案 1 :(得分:0)

您不导入Firebase存储,因此这意味着该服务在您的代码中将不可用。

"@firebase/firebase-storage": "^5.1.0",

添加此依赖项后,其余代码看起来都很好。