TypeError:无法读取未定义 Firebase 存储反应的属性“参考”

Posted

技术标签:

【中文标题】TypeError:无法读取未定义 Firebase 存储反应的属性“参考”【英文标题】:TypeError: Cannot read property 'ref' of undefined Firebase-storage react 【发布时间】:2020-04-14 04:13:20 【问题描述】:

我正在制作一个应用程序,用户可以上传文件并存储在 Firebase 存储中。 当我单击上传时,不断收到错误“TypeError:无法读取未定义的属性 'ref'”firebase 配置看起来正确。 任何帮助,非常感谢提示!

这是我的代码

import React from "react";
import firebase from "./services/firebase";
import storage from "./services/firebase";

export class Upload extends React.Component 
  constructor(props) 
    super(props);
    this.state =  image: null, url: "" ;
    this.handleUpload = this.handleUpload.bind(this);
    this.handleChange = this.handleChange.bind(this);
  

  handleChange(event) 
    console.log(event.target.files[0]);
    if (event.target.files[0]) 
      const image = event.target.files[0];
      this.setState( image: image );
    
  

  handleUpload() 
    const image = this.state.image;
    console.log(image);
    const uploadTask = firebase.storage.ref(`images/$image.name`).put(image);
    uploadTask.on("state_changed", () => 
      firebase.storage
        .ref("images")
        .child(image.name)
        .getDownloadURL()
        .then(url => 
          this.setState( url );
        );
    );
  

  render() 
    console.log(this.state.image);
    return (
      <div className="upload">
        <h2 className="title">Upload content for your project</h2>
        <div className="container">
         <label>Photo</label>
                <img src="/imgs/P.png"  />
                <input
                  type="file"
                  accept=".jpg, image/png, .jpeg, .gif"
                  onChange=this.handleChange
                />
                <button onClick=this.handleUpload>Upload</button>
        </div>
     </div>
    );
  

这里是“./services/firebase”文件


import firebase from "firebase/app";
import "firebase/database";
import "firebase/auth";
import "firebase/storage";
import "firebase/firestore";
import config from "./config";


const firebaseConfig = config;


firebase.initializeApp(firebaseConfig);


const database = firebase.database();


const listenTo = (dataToListenTo = "", callbackFunction = () => ) => 
  const databaseRef = database.ref(dataToListenTo);

  databaseRef.on("value", snapshot => 
    callbackFunction(snapshot);
  );

  return databaseRef;
;


const writeTo = (dataToWriteTo = "", value) => 
  const databaseRef = database.ref(dataToWriteTo);

  databaseRef.push(value);
;


const update = (keyToUpdate = "", value) => 
  const databaseRef = database.ref(keyToUpdate);

  databaseRef.update(value);
;


const remove = (keyToUpdate = "") => 
  const databaseRef = database.ref(keyToUpdate);

  databaseRef.remove();
;


const getCurrentUser = () => 
  return firebase.auth().currentUser;
;


const isLoggedIn = () => 
  if (firebase.auth().currentUser) 
    return true;
  

  return false;
;

const signIn = (email, password) => 
  return firebase.auth().signInWithEmailAndPassword(email, password);
;


const onLoginChange = (callbackFunction = () => ) => 
  const authRef = firebase.auth().onAuthStateChanged(user => 
    callbackFunction(user);
  );

  return authRef;
;


const signOut = () => 
  return firebase.auth().signOut();
;

const createUser = (email, password) => 
  return firebase.auth().createUserWithEmailAndPassword(email, password);
;

export default 
  writeTo,
  listenTo,
  update,
  remove,
  getCurrentUser,
  isLoggedIn,
  signIn,
  onLoginChange,
  signOut,
  createUser
;

我做错了什么?

【问题讨论】:

我没有看到你初始化了 firebase。 ref 不是documentation 中描述的属性吗? firebase.storage.ref.child("images/" + image.name) 应该可以解决问题 @HAßdøµ 嗨,我在不同的组件中做了并导入了 @ruX ref 和 storage 都不是属性firebase.google.com/docs/storage/web/upload-files#upload_files @Yukichka 尝试导入第一个进行初始化的组件,然后导入其他组件。 【参考方案1】:

storage() 是一种方法而不是属性,因此在您的代码中您应该使用以下内容:

firebase.storage().ref(`images/$images.name`)


firebase.storage().ref("images")

点击此处了解更多信息:

https://firebase.google.com/docs/reference/js/firebase.storage.html

【讨论】:

【参考方案2】:

希望这可以分享另一个观点,也许操作顺序会有所帮助,正如您在我的帐户中看到的那样,仍在学习自己。

我通过移动“const userUid = firebase.auth.currentUser!.uid”解决了这个问题 深入到它正在使用的函数中,如下所示:

const userUid = auth.currentUser.uid;

const handleSubmit = (e: any) => 
    e.preventDefault();
    setLoader(true);
    dbuser
      .collection("User Data")
      .doc(userUid)
      .set(
        name: name,
        email: email,
        message: message,
      )
      .then(() => 
        alert(
          "Congratulations"
        );
        setLoader(false);
      )
      .catch();
    // alert(error.message);
    setLoader(false);

to

  const handleSubmit = (e: any) => 
    const userUid = auth.currentUser!.uid;
    e.preventDefault();
    setLoader(true);
    dbuser
      .collection("User Data")
      .doc(userUid)
      .set(
        name: name,
        email: email,
        message: message,
      )
      .then(() => 
        alert(
          "Congratulations, it will take 1 business day to review and approve your seller profile"
        );
        setLoader(false);
      )
      .catch();

    // alert(error.message);
    setLoader(false);

【讨论】:

以上是关于TypeError:无法读取未定义 Firebase 存储反应的属性“参考”的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的属性“findAll”(expressjs)

TypeError:无法读取未定义的属性(读取“问题”)

TypeError:无法在 gitlab 中读取未定义的属性(读取“读取”)

TypeError:无法读取未定义的属性(读取“国家”)

TypeError:无法读取未定义的属性(读取“匹配”):

TypeError:无法读取未定义的属性“babel”