[英]TypeError: firebase.storage is not a function
按照这个例子,我不断收到错误:
TypeError: firebase.storage is not a function
从我的代码中的这一行:
var storageRef = firebase.storage().ref();
(当我只是尝试从storage guide初始化存储时,从firebase 的 npm 站点链接,我得到了同样的错误。)
在我的 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()
的无效参数()
和使用"/"
...但具有相同的消息,但无济于事。
我正在使用:
我必须怎么做才能成功创建对存储的引用?
我遇到了同样的问题。 就我而言,除了 Firebase 核心之外,我还需要包含存储模块。
import firebase from 'firebase/app';
import 'firebase/storage'; // <----
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
(npm firebase v5.0.4)
已弃用,见下文:
根据this answer ,在Node.js中,应使用google-cloud
package storage而不是firebase storage,似乎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')
另请查看文档以获取更多信息。
google-cloud
。 到目前为止,Firebase 和 Google Cloud 的参考和指南并未反映这一点。firebase-admin
SDK,所以我现在不必搞乱用户身份验证。创建一个使用 Firebase 和 Google Cloud 的 Node.js 项目。 为什么? Firebase 有一个有用的数据库和其他功能,而 Google Cloud 允许云文件存储和检索。
创建Firebase和Google Cloud(存储)项目。
使用npm ,在Node.js
项目中安装firebase-admin
和google-cloud
。
注 1:我使用了 admin SDK,因此在创建 Firebase 项目后,您需要转到:
Node.js
> [将生成的代码复制/粘贴到您的项目中] > [单击“生成新私钥”] > [将生成的json
下载到首选位置] > [替换"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,请转到 Firebase 中的“存储”,并记下以gs:
开头的 URL,并将其复制/粘贴到 databaseURL 的值字段。
接下来,获取对您可以使用的数据库的引用:
var db = admin.database();
var ref = db.ref("/");
console.log('DB ref: ' + ref); //just to debug, if undefined, there's a problem.
要了解有关读取/写入数据库的更多信息,请遵循Firebase 自己的文档。
在 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 Storage 和 Google Cloud Storage 中可见,那么您就大功告成了!
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>
将 Storage 与 Firebase 结合使用时,您无法在免费层添加存储桶是正确的。 但是,默认情况下您确实会获得一个存储桶(只有一个)。 我(最终)成功的方法是:
将存储添加到我在 Firebase 中的项目(不是 Google Cloud)
添加 Admin SDK 并根据 Google Docs 设置必要的服务帐户: 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://
在存储桶的路径中。
我遇到了同样的问题,我的代码如下:
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 测试
更新版本 9
import { initializeApp } from "firebase/app";
import { getStorage } from "firebase/storage";
// Set the configuration for your app
// TODO: Replace with your app's config object
const firebaseConfig = {
apiKey: '<your-api-key>',
authDomain: '<your-auth-domain>',
databaseURL: '<your-database-url>',
storageBucket: '<your-storage-bucket-url>'
};
const firebaseApp = initializeApp(firebaseConfig);
// Get a reference to the storage service, which is used to create references in your storage bucket
const storage = getStorage(firebaseApp);
确保您在 HTML 文件< src="https://www.gstatic.com/firebasejs/7.12.0/firebase-storage.js" 中添加了带有此 src 的脚本标记到您的项目
我可以使用 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() 或做任何不同的事情时,它都行不通! 希望对你们中的一些人有所帮助。
我认为 firebase 的 V9 有一种不同的方式让我们使用它的存储。 要使用 firebase 存储,您可以将存储导入为 -
import { getStorage } from "firebase/storage";
现在你可以按照这个 -
const firebaseApp = firebase.initializeApp(firebaseConfig);
const storage = getStorage(firebaseApp);
如果你尝试像下面那样做,它会改变吗?
// Initialize the default app:
const app = firebase.initializeApp(appConfig)
// Initialize storage from the *app* object:
const storage = app.storage()
从文档来看,这似乎是一种替代方法。 我更喜欢这个,因为它将存储链接到应用程序,使代码更具可读性和功能
看起来他们已经在新版本的库中修复了它。 只需在相关包上运行npm update
就可以了。
我在本地测试我的应用程序时遇到了同样的问题,但在部署项目时一切正常。
这样,我实际上使用了以下解决方法:
if (!firebase.storage) {
// prevent crash when working locally
return;
}
let ref = firebase.storage().ref()
// perform production stuff ...
这有点好奇,但它适用于我的情况。
firebase 存储服务在浏览器中仍然有效(并且 AFAIK 没有被弃用)。 firebase 存储服务在服务器环境中不可用,包括在服务器端渲染期间。
这是我如何做到的:
// only import uploadHandler client-side.
const uploadHandler = typeof window === 'object' ? require('./handlers').imageHandler : () => false; // ssr only
然后在handlers.js
您可以安全地正常使用 firebase 存储服务。
import * as firebase from 'firebase'
const storageRef = firebase.storage().ref();
const bucketObjectRef = storageRef.child('myFile.jpg');
截至 2020 年 4 月 3 日,浏览器环境似乎仍支持整个 firebase 产品套件。
我在浏览器(webapp)上集成firebase的存储时遇到了类似的问题
<script src="https://www.gstatic.com/firebasejs/7.15.0/firebase-storage.js"></script>
只需添加该行,错误就消失了!
在 app.module 中import firebase from 'firebase/app'
firebase import firebase from 'firebase/app'
初始化import firebase from 'firebase/app'
firebase ; import 'firebase/storage'
;
firebase.storage();
从'firebase/app'导入*作为firebase;
然后 firebase.storage().ref() 应该可以工作。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.