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
这样,后端不可用的存储部分不会加载,但在前端会加载,一切正常!
感谢两位的回答!
实际上,标题或多或少就是对问题的全部解释。 我正在尝试在我的 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
这样,后端不可用的存储部分不会加载,但在前端会加载,一切正常!
感谢两位的回答!