Ошибка типа: firebase.storage не является функцией
Следуя этому примеру, я продолжаю получать сообщение об ошибке:
TypeError: firebase.storage is not a function
Из этой строки в моем коде:
var storageRef = firebase.storage().ref();
(И когда я просто пытаюсь инициализировать хранилище из руководства по хранилищу, связанного с сайтом 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()
Пустой аргумент ()
и с "/"
... но иметь то же сообщение, но безрезультатно.
Я использую:
- "огненная база": "^ 3.6.4"
- "firebase-admin": "^ 4.0.4"
- Node.js: v6.9.1
Что я должен сделать, чтобы успешно создать ссылку на хранилище?
17 ответов
УСТАРЕЛО, см. Ниже:
Согласно этому ответу, вместо хранилища Fire base в Node.js, google-cloud
следует использовать хранилище пакетов, и, похоже, этот ответ должен это подтвердить. Пример кода:
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')
Также проверьте документы для больше.
Я столкнулся с той же проблемой. В моем случае мне нужно было включить модуль хранения помимо ядра Firebase.
import firebase from 'firebase';
import 'firebase/storage'; // <----
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
(npm firebase v5.0.4)
Некоторые детали, чтобы отметить:
- Firebase Storage больше не используется с Node.js, вся документация там бесполезна для Node.js. Вместо этого используйте
google-cloud
, Ссылки и руководства для Firebase и Google Cloud не отражают это на сегодняшний день. - В отличие от Firebase, Google-облако стоит денег даже для небольших проектов.
- В моем случае я использую
firebase-admin
SDK, поэтому мне не нужно связываться с аутентификацией пользователей в данный момент.
Цель
Создать единый проект Node.js, который использует Firebase и Google Cloud. Зачем? Firebase имеет полезную базу данных, помимо других функций, а Google Cloud позволяет хранить и извлекать файлы в облаке.
Направления
Шаг 1: Создание проекта
Создавайте проекты Firebase и Google Cloud (Storage).
Шаг 2: Установите пакеты
Используя npm, установите firebase-admin
а также google-cloud
в Node.js
проект.
Примечание 1: я использовал административный SDK, поэтому после создания проекта Firebase вам нужно будет перейти к:
- Настройки (передача) > Настройки проекта > Сервисные учетные записи > Firebase Admin SDK
- Тогда вы: выберите
Node.js
> [Скопируйте / вставьте сгенерированный код в ваш проект] > [нажмите "Создать новый закрытый ключ"] > [загрузите сгенерированныйjson
в предпочтительное место] > [заменить"path/to...AccountKey.json"
с путем к ключу, который вы только что сгенерировали]
Примечание 2: сгенерированный ключ может быть повторно использован в учетных данных firebase или google-cloud.
Шаг 3: Настройка Firebase
Как только ваш проект создан, импортируйте 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 и запишите URL, начинающийся с 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.
Шаг 4. Настройка биллинга Google-Cloud
После создания проекта в Google Cloud добавьте платежную информацию; ведра не могут быть использованы без платежной информации.
Шаг 5: Настройка Google-Cloud Storage
- Прокручивая меню (горизонтальные 3 бара), нажмите "Хранилище", затем "Включить биллинг". Да, вы добавили платежную информацию, теперь вам нужно включить ее для корзин этого проекта.
- Вы должны увидеть, что корзина уже существует из вашего проекта Firebase.
- Снова нажмите меню (значок с 3 полосами), затем> IAM & Admin > Настройки
- В настройках вы увидите "Project ID", который должен выглядеть как "projectName-00000" или "projectName-Some#", скопируйте этот ID проекта
Шаг 6: Google Cloud в Node.js
В вашем 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);
}
});
Шаг 7. Проверьте
Если файл виден в Firebase Storage и Google Cloud Storage, все готово!
Ответ 2020 года. В моем случае я включаю firebase-storage.js в файл.html.
<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>
У меня была такая же проблема, у меня был следующий код:
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
Используя Storage с Firebase, вы правы, что не можете добавлять сегменты на уровне бесплатного пользования. Тем не менее, вы действительно получаете ведро (только один) по умолчанию. Мой (в конечном итоге) успешный подход заключался в следующем:
Добавить хранилище в мой проект в Firebase (НЕ в Google Cloud)
Добавьте Admin SDK и настройте необходимую учетную запись службы в соответствии с Документами Google: https://firebase.google.com/docs/admin/setup?authuser=1
Добавить
@google-cloud/storage
пакет в соответствии с инструкциями по использованию Admin SDK с хранилищем: 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://
в пути к моему хранилищу при инициализации.
ОБНОВЛЕНО ДЛЯ ВЕРСИИ 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);
Источник: https://firebase.google.com/docs/storage/web/start
Убедитесь , что вы добавили тег скрипта с этим src в свой HTML-файл
- Здесь 7.12.0 будет заменена вашей текущей рабочей версией.
Я думаю, что у V9 firebase есть другой способ позволить нам использовать его хранилище. Для использования хранилища firebase вы можете импортировать хранилище как -
import { getStorage } from "firebase/storage";
Теперь вы можете следить за этим -
const firebaseApp = firebase.initializeApp(firebaseConfig);
const storage = getStorage(firebaseApp);
Я смог использовать 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 () или делать что-то другое, это не сработает! Надеюсь, это поможет некоторым из вас, ребята.
Изменится ли он, если вы попытаетесь сделать это следующим образом?
// Initialize the default app:
const app = firebase.initializeApp(appConfig)
// Initialize storage from the *app* object:
const storage = app.storage()
Из документации кажется, что это альтернативный метод. Я предпочитаю этот, так как это связывает хранилище с приложением, делая код более читабельным и более функциональным
Я сталкиваюсь с той же проблемой при локальном тестировании приложения, но все работает, когда проект развернут.
Таким образом, я на самом деле использую следующий обходной путь:
if (!firebase.storage) {
// prevent crash when working locally
return;
}
let ref = firebase.storage().ref()
// perform production stuff ...
Это немного любопытно, но в моем случае это работает.
в app.module initilize
import firebase from 'firebase/app'
;
import 'firebase/storage'
;
firebase.storage();
Похоже, они исправили это в новой версии библиотеки. Просто беги npm update
на соответствующий пакет (ы), и это должно работать.
Служба хранилища 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');
По состоянию на 3 апреля 2020 г., похоже, весь набор продуктов firebase по-прежнему поддерживается в средах браузеров.
Я столкнулся с подобной проблемой, когда интегрировал хранилище firebase в браузер (webapp).
<script src="https://www.gstatic.com/firebasejs/7.15.0/firebase-storage.js"></script>
Просто добавьте эту строку, и ошибка исчезнет!
Import * как firebase из firebase/app;
Тогда firebase.storage(). Ref() должен работать.
Надеюсь это поможет.