firebase 存储 ref 不是函数

Posted

技术标签:

【中文标题】firebase 存储 ref 不是函数【英文标题】:firebase storage ref is not a function 【发布时间】:2021-12-26 00:17:25 【问题描述】:

我是网络开发新手。在过去的 24 小时内,我试图在整个互联网上找到答案,但没有成功,现在我在这里伸出援手

这是我的错误:

未捕获的类型错误:firebase__WEBPACK_IMPORTED_MODULE_3_.storage.ref 不是函数

这是 firebase.js 文件:

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


const firebaseConfig = 
    apiKey: "",
    authDomain: "",
    projectId: "",
    storageBucket: "",
    messagingSenderId: "",
    appId: ""
;

const app = initializeApp(firebaseConfig);

export const storage = getStorage(app);

我正在像这样导入组件中的存储:

import storage from "../../firebase";

这是上传功能:

    const upload = (items) => 
    items.forEach((item) => 
        const fileName = new Date().getTime() + item.label + item.file.name;
        const uploadTask = storage.ref(`/items/$fileName`).put(item.file);
        uploadTask.on(
            "state_changed",
            (snapshot) => 
                const progress =
                    (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
                console.log("Upload is " + progress + "% done");
            ,
            (error) => 
                console.log(error);
            ,
            () => 
                uploadTask.snapshot.ref.getDownloadURL().then((url) => 
                    setMovie((prev) => 
                        return  ...prev, [item.label]: url ;
                    );
                    setUploaded((prev) => prev + 1);
                );
            
        );
    );
;

有什么建议吗?

【问题讨论】:

【参考方案1】:

您正在将旧版命名空间 Firebase JS SDK(v8 及更早版本)的语法与更新的模块化 Firebase SDK(v9 及更高版本)一起使用。

您需要使用ref(storage, path),而不是storage.ref()

import  storage  from "../../firebase"
import  ref, uploadBytes  from "firebase/storage";

const upload = (items) => 
  items.forEach((item, index) => 
    const storageRef = ref(storage, `/items/$fileName`);
    const uploadTask = uploadBytes(storageRef, item.file);

    uploadTask.on(
      "state_changed",
      (snapshot) => 
        const progress =
          Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 1000)/10;
        console.log(`Upload #$index+1 is $progress% done`);
      ,
      (error) => 
        console.log(error);
      ,
      () => 
        console.log(`Upload #$index+1 is complete, fetching URL...`);
        getDownloadURL(storageRef)
          .then((url) => 
            console.log(`Upload #$index+1 is now available at $url.`);
            setMovie((prev) => 
              return  ...prev, [item.label]: url ;
            );
            setUploaded((prev) => prev + 1);
          )
          .catch((error) => 
            console.log(error);
          );
      
    );
  );

我鼓励您完整阅读documentation 并阅读migration guide,以便了解您正在使用的代码是针对哪个 SDK 版本构建的。

注意:您应该进一步改进此代码以更好地处理错误,例如为失败的上传设置对用户可见的错误消息。

【讨论】:

嗨,山姆,感谢您的评论,我会阅读更多文档。谢谢你的提示,我希望这个功能能成功。我祝愿一切顺利,度过美好的一天

以上是关于firebase 存储 ref 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Cloud Functions 数据库触发器“onCreate 不是函数”

Cloud Storage for Firebase 访问错误“admin.storage(...).ref 不是函数”

上传到 Firebase 错误“.storage.ref 不是函数”

如何更改firebase存储的位置?

__ firebase2.default.database.ref不是函数

使用 multer 将图像上传到 Firebase 存储问题