【问题标题】:firebase.storage() takes either no argument or a Firebase App instancefirebase.storage() 不接受任何参数或 Firebase App 实例
【发布时间】:2017-10-23 18:07:04
【问题描述】:

实际上,标题或多或少是对问题的全部解释。 我正在尝试在我的 React 应用程序中使用 Firebase,该应用程序也使用 NextJS,但问题是我无法让存储工作。

import firebase from 'firebase'
import uuid from 'uuid/v4'

// Init
try {
  firebase.initializeApp({
    apiKey: 'apiKey',
    authDomain: 'authDomain',
    databaseURL: 'dbUrl',
    projectId: 'projID',
    storageBucket: 'storageBucket',
    messagingSenderId: 'id'
  })
} catch (err) {
  if (!/already exists/.test(err.message)) {
    console.error('Firebase initialization error', err.stack)
  }
}

console.log(firebase.app().name) // <- name

// References
const database = firebase.database()
const storage = firebase.storage().ref() // <- the problem 
const documentImageStorage = storage.child('images/')
const documentsRef = database.ref('/documents/')
const documentsRequestsRef = database.ref('/requests/')

因此,当我运行代码时,我可以确认应用程序可以正常工作,因为数据库正常工作并且名称 ([default]) 正确返回,但存储引用所在的行是定义返回错误:

Firebase: firebase.storage() takes either no argument or a Firebase App instance. (app/invalid-app-argument).

任何想法为什么会发生这种情况?我该如何解决?

【问题讨论】:

    标签: javascript reactjs firebase firebase-storage


    【解决方案1】:

    Firebase 文档指出您将存储服务引用保存到变量,然后将存储引用保存到不同的变量。

    https://firebase.google.com/docs/storage/web/create-reference

    所以我会这样做:

    const storage = firebase.storage(); const storageRef = storage.ref();

    你也可以把你的存储文件夹的路径放到它的引用上,像这样:

    const documentImageStorage = storage.ref('/images/'); 
    

    【讨论】:

    • firebase.storage().ref() 是有效的工作代码,您实际上可以在链接页面底部的完整示例中看到它:firebase.google.com/docs/storage/web/… - 我根据对实际问题的理解添加了一个答案.
    【解决方案2】:

    (Firebase 存储 JS 开发)

    我能够在 Next.js 中重现您的错误。我对它不是很熟悉,但是我理解 Next.js 是做 React-y 服务器端渲染的,所以你为你的页面编写的代码一般会在节点服务器中执行。

    不幸的是,Storage isn't supported in node 现在包含服务器端渲染上下文(请随时在 Github 问题中就您的用例发表评论)。

    它应该可以在普通的 React 应用程序(即客户端代码)中工作。

    编辑:找到(几乎)解决方法

    如果您在文件顶部添加导入,代码似乎不会在 Next.js 中崩溃:

    import firebase from 'firebase'
    import _s from 'firebase/storage'
    import uuid from 'uuid/v4'
    ...
    

    无论如何,node.js 仍然不支持 Storage 库。大多数有趣的事情(上传对象、获取对象元数据)都不起作用,所以除非您只想在某个地方调用 storage.toString(),否则这可能无法解决您的问题。

    【讨论】:

      【解决方案3】:

      好的,所以我想出了如何让它工作!

      export const storage = process.browser ? firebase.storage().ref() : undefined
      

      这样,后端不可用的存储部分不会被加载,但在前端它是并且一切正常!

      感谢您的两个回答!

      【讨论】:

        猜你喜欢
        • 2022-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 2020-02-23
        • 2020-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多