Ошибка типа: 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)

Некоторые детали, чтобы отметить:

  1. Firebase Storage больше не используется с Node.js, вся документация там бесполезна для Node.js. Вместо этого используйте google-cloud, Ссылки и руководства для Firebase и Google Cloud не отражают это на сегодняшний день.
  2. В отличие от Firebase, Google-облако стоит денег даже для небольших проектов.
  3. В моем случае я использую 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

  1. Прокручивая меню (горизонтальные 3 бара), нажмите "Хранилище", затем "Включить биллинг". Да, вы добавили платежную информацию, теперь вам нужно включить ее для корзин этого проекта.
  2. Вы должны увидеть, что корзина уже существует из вашего проекта Firebase.
  3. Снова нажмите меню (значок с 3 полосами), затем> IAM & Admin > Настройки
  4. В настройках вы увидите "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, вы правы, что не можете добавлять сегменты на уровне бесплатного пользования. Тем не менее, вы действительно получаете ведро (только один) по умолчанию. Мой (в конечном итоге) успешный подход заключался в следующем:

  1. Добавить хранилище в мой проект в Firebase (НЕ в Google Cloud)

  2. Добавьте Admin SDK и настройте необходимую учетную запись службы в соответствии с Документами Google: https://firebase.google.com/docs/admin/setup?authuser=1

  3. Добавить @google-cloud/storage пакет в соответствии с инструкциями по использованию Admin SDK с хранилищем: https://firebase.google.com/docs/storage/admin/start?authuser=1

  4. Инициализировать приложение:

    admin.initializeApp({
      credential: admin.credential.cert("/path/to/generated/json/here.json"),
      storageBucket: "folder-URL-from-Storage-page-excluding-gs://"
    });
    
  5. Получите доступ к объекту корзины с помощью (из документов Admin SDK):

    const bucket = admin.storage().bucket();

  6. Работайте на ведре с библиотекой хранилища. Пример:

    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 по-прежнему поддерживается в средах браузеров.

Источник: https://firebase.google.com/docs/web/setup

Я столкнулся с подобной проблемой, когда интегрировал хранилище firebase в браузер (webapp).

  <script src="https://www.gstatic.com/firebasejs/7.15.0/firebase-storage.js"></script>

Просто добавьте эту строку, и ошибка исчезнет!

Import * как firebase из firebase/app;

Тогда firebase.storage(). Ref() должен работать.

Надеюсь это поможет.

Другие вопросы по тегам