Подтвердить что ты не робот

TypeError: firebase.storage не является функцией

Следуя этому, я продолжаю получать ошибку:

 TypeError: firebase.storage is not a function

Из этой строки в моем коде:

var storageRef = firebase.storage().ref();

(И когда я просто пытаюсь инициализировать хранилище из руководство по хранению, связанное с firebase 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 правильно. Но я застрял на 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() аргумент void () и "/"... но имеют одно и то же сообщение, но безрезультатно.

Я использую:

  • "firebase": "^ 3.6.4"
  • "firebase-admin": "^ 4.0.4"
  • Node.js: v6.9.1

Что мне делать, чтобы успешно создать ссылку на хранилище?

4b9b3361

Ответ 1

УСТАРЕЛО, см. Ниже:

Согласно этому ответу, вместо хранилища firebase в 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')

Также проверьте документы для больше.

Ответ 2

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

  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" место]> [замените "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 a problem.

Чтобы узнать больше о чтении/записи в базу данных, следуйте собственной документации Firebase.

Шаг 4. Настройка биллинга Google-Cloud

После создания проекта в Google Cloud добавьте платежную информацию; ведра не могут быть использованы без платежной информации.

Шаг 5: Настройка Google-Cloud Storage

  1. Прокручивая меню (горизонтальные 3 бара), нажмите "Хранилище", затем "Включить биллинг". Да, вы добавили платежную информацию, теперь вам нужно включить ее для корзин этого проекта.
  2. Вы должны увидеть, что корзина уже существует из вашего проекта Firebase.
  3. Снова нажмите меню (значок с 3 полосами), затем> IAM & Admin> Настройки
  4. В настройках вы увидите "Идентификатор проекта", который должен выглядеть как "projectName-00000" или "projectName-Some #", скопируйте этот идентификатор проекта

Шаг 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, все готово!

Ответ 3

Используя 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:// в пути к моему хранилищу при инициализации.

Ответ 4

Я столкнулся с той же проблемой. В моем случае мне нужно было включить модуль хранения помимо ядра Firebase.

import firebase from 'firebase';
import 'firebase/storage';  // <----

firebase.initializeApp({
  ...
});
const storageRef = firebase.storage().ref();

(npm firebase v5.0.4)

Ответ 5

Я сталкиваюсь с той же проблемой при локальном тестировании приложения, но все работает, когда проект развернут.

Таким образом, я на самом деле использую следующий обходной путь:

if (!firebase.storage) {
    // prevent crash when working locally
    return;
}
let ref = firebase.storage().ref()
// perform production stuff ...

Это немного любопытно, но это работает в моем случае.

Ответ 6

Изменится ли это, если вы попытаетесь сделать это следующим образом?

// Initialize the default app:
const app = firebase.initializeApp(appConfig)

// Initialize storage from the *app* object:
const storage = app.storage()

Из документов кажется, что это альтернативный метод. Я предпочитаю это, поскольку это связывает хранилище с приложением, делая код более читаемым и более функциональным

Ответ 7

Похоже, они исправили это в новой версии библиотеки. Просто запустите npm update для соответствующего пакета (ов), и оно должно работать.