firebase.storage() 不接受任何参数或一个 Firebase App 实例

firebase.storage() takes either no argument or a Firebase App instance

实际上,标题或多或少就是对问题的全部解释。 我正在尝试在我的 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]) 已正确返回,但是定义存储引用的行 returns 出错:

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

知道为什么会发生这种情况吗?我该如何解决?

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

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

所以我会这样做:

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

您还可以输入存储文件夹的路径以获取参考,如下所示:

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

(Firebase 存储 JS 开发)

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

不幸的是,现在存储 isn't supported in node,其中包括服务器端呈现上下文(请随时在 Github 问题中发表有关您的用例的评论)。

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

编辑:找到了(勉强)解决方法

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

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

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

好的,所以我想出了如何让它发挥作用!

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

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

感谢两位的回答!