Ошибка типа: firebase.storage не является функцией

29

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

 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

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

  • 0
    Дублирование? stackoverflow.com/questions/37369466/...
  • 1
    @SergChernata Нет, это совершенно другая ошибка. « Firebase is not a function . Их ошибка заключалась в том, что они не инициализировали Firebase должным образом, в то время как я это сделал, и смог использовать базу данных Firebase и другие функции соответственно. Проблема с Firebase Storage.
Показать ещё 2 комментария
Теги:
firebase
firebase-storage

7 ответов

19
Лучший ответ

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

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

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

  • 3
    Уже возникло предупреждение ... npm WARN deprecated [email protected]:gcloud has been renamed to google-cloud. To get new features and bug fixes, you must use the new package. ... так что я опубликую это, чтобы держать информацию в актуальном состоянии ... прорабатывая это сейчас, благодаря этому второму ответу ...
  • 0
    Исправил ответ, чтобы отразить изменение. Спасибо!
Показать ещё 3 комментария
16

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

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

  • 0
    как вы аутентифицируете пользователя и обслуживаете его файлы во время всего этого?
5

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

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

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

(npm firebase v5.0.4)

  • 0
    Спасибо за отзыв, я обнаружил, что у 'firebase' нет экспортированного члена 'хранилища' с помощью firebase.storage (). Ref ()
5

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

  • 0
    Я получаю сообщение об ошибке "TypeError: admin.storage не является функцией"
  • 0
    Tushar создайте приложение без сертификата безопасности. Морган, спасибо. Это правильный ответ. Я бы добавил, что .save() работает для буферов, если у вас нет локального файла (например, пользователю нужно загрузить аватар или что-то еще).
Показать ещё 2 комментария
1

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

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

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

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

  • 0
    Это очень интересно! В моем случае мое приложение также было развернуто, поэтому интересно то, что это работает для вас, но не для меня. Моя работа заключалась в использовании хранилища Google Cloud
0

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

0

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

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

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

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

  • 0
    Без изменений ... если не учитывается новая ошибка ... В строке var storage = app.storage(); Я получаю эту ошибку: TypeError: app.storage is not a function ... И я сделал это: var app = firebase.initializeApp(config); перед рукой.
  • 1
    Я понимаю, что это не сработало, и я добавлю второй ответ с лучшей попыткой. Тем не менее, я оставлю это здесь для потенциальных веб-программистов, которые могут оказаться здесь. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню