按照this示例,我不断收到错误:
TypeError: firebase.storage is not a function
从我的代码中的这一行:
var storageRef = firebase.storage().ref();
(当我尝试初始化来自storage guide的firebase's npm site的存储空间时,我会收到同样的错误。)
在我的Node.js项目中,我包括以下库:
const firebase = require('firebase');
var admin = require('firebase-admin');
const fs = require('fs');
到目前为止,我已成功读取并写入firebase数据库,使用var db = admin.database()
创建对数据库的引用,然后var ref = db.ref("/")
...所以我知道我已正确配置Firebase和firebase-database。但我仍然坚持storage
,并尝试使用相同的错误消息admin.storage().ref()
和firebase.storage().ref()
以及firebase.storage().ref("/")
。
我也尝试过:
var storage = firbase.storage();
var storageRef = storage.ref();
和
const app = firebase.initializeApp(config);
var storage = app.storage();
并使用ref()
的无效参数()
和"/"
...但是有相同的信息,但无济于事。
我正在使用:
如何成功创建存储参考?
答案 0 :(得分:23)
已弃用,见下文:
根据this answer,在Node.js中,应使用google-cloud
包存储,而不是firebase存储,this answer似乎应该确认它。代码示例:
npm i --save google-cloud
然后:
const gcloud = require('google-cloud')
const storage = gcloud.storage({
projectId: '<projectID>',
keyFilename: 'service-account-credentials.json',
});
const bucket = storage.bucket('<projectID>.appspot.com')
截至2018年,这是正确答案:
或仅使用包裹的存储部分:
npm install --save @google-cloud/storage
然后:
var storage = require('@google-cloud/storage')
另请查看the docs了解更多信息。
答案 1 :(得分:17)
google-cloud
。 Firebase和Google Cloud的参考和指南截至目前尚未反映这一点。firebase-admin
SDK,因此我现在不必弄乱用户身份验证。创建一个使用Firebase和Google Cloud的Node.js项目。 为什么? Firebase拥有一个有用的数据库,以及其他功能,而Google Cloud允许云文件存储和检索。
创建Firebase和Google Cloud (Storage)项目。
使用npm,在Node.js
项目中安装firebase-admin
和google-cloud
。
注1:我使用了管理员SDK,因此在创建Firebase项目后,您需要转到:
Node.js
&gt; [将生成的代码复制/粘贴到
你的项目]&gt; [点击&#34;生成新私钥&#34;]&gt; [下载
生成json
到首选位置]&gt; [更换
"path/to...AccountKey.json"
以及您刚刚获得密钥的路径
产生注意2:生成的密钥可以在firebase或google-cloud凭据中重复使用。
创建项目后,导入firebase-admin
sdk:
代码应该如下所示,但填写了您的信息:
var admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.cert("/path/to/generated/json/here.json"),
databaseURL: "database-url-from-firebase"
});
要查找databaseURL,请转到&#39;存储&#39;在Firebase中,记下以gs:
开头的网址,然后将其复制/粘贴到databaseURL的值字段中。
接下来,获取对您可以使用的数据库的引用:
var db = admin.database();
var ref = db.ref("/");
console.log('DB ref: ' + ref); //just to debug, if undefined, there's a problem.
要了解有关阅读/写入数据库的更多信息,请按照Firebase's own documentation。
在Google Cloud上创建项目后,添加结算信息;如果没有结算信息,则无法使用存储桶。
在index.js
:
var gcloud = require('google-cloud');
var gcs = gcloud.storage({
projectId: 'paste-that-project-id-here',
keyFilename: 'paste-that-path-to-the-previously-downloaded-json-from-firebase-here'
});
现在您可以通过以下方式将文件发送到您的存储空间:
var bucket = gcs.bucket('bucket_name');
var remoteFile = bucket.file('somefile-inThisCaseASong.mp3');
var localFilename = '/Users/you/Music/somefile-inThisCaseASong.mp3';
bucket.upload(localFilename, function(err, file) {
if (!err) {
console.log('somefile-inThisCaseASong.mp3 is now in your bucket.');
} else {
console.log('Error uploading file: ' + err);
}
});
如果文件在Firebase存储和Google云端存储中可见,您就完成了!
答案 2 :(得分:10)
我遇到了同样的问题。就我而言,除了Firebase核心之外,我还需要包含存储模块。
boxplot.stats()
(npm firebase v5.0.4)
答案 3 :(得分:6)
2020年答案,就我而言,我在.html文件中包含firebase-storage.js
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-storage.js"></script>
因此,如果您使用所有Firebase服务,您将拥有
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-messaging.js"></script>
<script src="https://www.gstatic.com/firebasejs/6.5.0/firebase-storage.js"></script>
<!-- your script calling Firebase Firestore under this line -->
<script>
....
</script>
答案 4 :(得分:5)
使用Storage with Firebase时,您无法在免费套餐上添加存储桶。但是,默认情况下,您会获得一个存储桶(只有一个)。我(最终)成功的方法是:
在Firebase(不是Google Cloud)中将存储添加到我的项目
根据Google文档添加管理员SDK并设置必要的服务帐户:https://firebase.google.com/docs/admin/setup?authuser=1
按照使用带存储空间的Admin SDK的说明添加@google-cloud/storage
包:https://firebase.google.com/docs/storage/admin/start?authuser=1
初始化应用:
admin.initializeApp({
credential: admin.credential.cert("/path/to/generated/json/here.json"),
storageBucket: "folder-URL-from-Storage-page-excluding-gs://"
});
使用(来自Admin SDK文档)访问存储桶对象:
const bucket = admin.storage().bucket();
使用存储库在存储桶上运行。示例:
bucket.upload('/path/file.ext', function(err, file, apiResponse) {
//Do Stuff
});
注意:我花了几个小时确信它没有工作,因为我没有存储桶,但事实证明我的错误是在初始化时将gs://
包含在存储桶的路径中。
答案 5 :(得分:4)
确保在HTML文件中添加了带有此src的脚本标签
答案 6 :(得分:2)
我遇到了同样的问题,我的代码如下:
import * as firebase from "firebase/app";
import 'firebase/storage';
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
所以,我发现只有当您使用 Typescript 时,这种方式才会出现。
如果仅使用 ES6 ,则必须具有:
import firebase from 'firebase/app';
import 'firebase/storage';
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
如果使用 ES5 ,则必须具有:
var firebase = require("firebase/app");
require("firebase/storage");
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
此外,您还可以使用以下方式,但是不建议您这样做,因为您会加载所有服务(数据库,身份验证,存储等):
import firebase from "firebase";
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
经过Firebase 7.15.2测试
答案 7 :(得分:1)
在本地测试我的应用程序时遇到相同的问题,但是在部署项目时一切正常。
这样,我实际上使用以下解决方法:
if (!firebase.storage) {
// prevent crash when working locally
return;
}
let ref = firebase.storage().ref()
// perform production stuff ...
这有点好奇,但是对于我来说还是可以的。
答案 8 :(得分:0)
如果您尝试按以下方式执行此操作,是否会发生变化?
// Initialize the default app:
const app = firebase.initializeApp(appConfig)
// Initialize storage from the *app* object:
const storage = app.storage()
从the docs开始,这似乎是另一种方法。我更喜欢这个,因为它将存储链接到应用程序,使代码更具可读性和功能性
答案 9 :(得分:0)
看起来他们已经在新版本的库中修复了它。
只需在相关软件包上运行npm update
即可。
答案 10 :(得分:0)
firebase存储服务在浏览器中仍然有效(并且不建议使用AFAIK)。 firebase存储服务在服务器环境中不可用,包括在服务器端渲染期间。
这是我的操作方式:
df_new_STACK
然后在// only import uploadHandler client-side.
const uploadHandler = typeof window === 'object' ? require('./handlers').imageHandler : () => false; // ssr only
中,您可以安全地正常使用Firebase存储服务。
handlers.js
截至2020年4月3日,似乎整个firebase产品套件仍在浏览器环境中受支持。
答案 11 :(得分:0)
我能够使用firebase.storage(),但花了一些时间才弄清楚。仅在这样导入时有效:
//Importing
const firebase = require('firebase')
require('firebase/storage')
//Calling the function (You can call it normally then)
const storageRef = firebase.storage().ref();
我很认真,每当尝试导入为firebase.storage()或进行其他任何操作均无法正常工作时!希望对您有所帮助。
答案 12 :(得分:0)
当我在浏览器(webapp)中集成Firebase的存储时遇到了类似的问题
<script src="https://www.gstatic.com/firebasejs/7.15.0/firebase-storage.js"></script>
只需添加该行,该错误就消失了!
答案 13 :(得分:0)
在 app.module 中初始化
50% completed ...
;
import firebase from 'firebase/app'
;
import 'firebase/storage'
答案 14 :(得分:-1)
从“ firebase / app”中导入*作为firebase;
然后firebase.storage()。ref()应该可以工作。
希望这会有所帮助。