Следуя этому, я продолжаю получать ошибку:
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 в 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')
Также проверьте документы для больше.
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.
... так что я опубликую это, чтобы держать информацию в актуальном состоянии ... прорабатывая это сейчас, благодаря этому второму ответу ...
google-cloud
. Ссылки и руководства для Firebase и Google Cloud не отражают это на сегодняшний день.firebase-admin
SDK, поэтому в данный момент мне не нужно связываться с аутентификацией пользователя.Создать единый проект Node.js, который использует Firebase и Google Cloud. Зачем? Firebase имеет полезную базу данных, помимо других функций, а Google Cloud позволяет хранить и получать файлы в облаке.
Создавайте проекты Firebase и Google Cloud (Storage).
Используя npm, установите firebase-admin
и google-cloud
в проекте Node.js
Примечание 1: я использовал административный SDK, поэтому после создания проекта Firebase вам нужно будет перейти к:
Node.js
> [Скопируйте/вставьте сгенерированный код в ваш проект]> [нажмите "Создать новый закрытый ключ"]> [загрузите сгенерированный json
в "path/to...AccountKey.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 и запишите 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.
После создания проекта в 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, все готово!
Я столкнулся с той же проблемой. В моем случае мне нужно было включить модуль хранения помимо ядра Firebase.
import firebase from 'firebase';
import 'firebase/storage'; // <----
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
(npm firebase v5.0.4)
Используя 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://
в пути к моему хранилищу при инициализации.
.save()
работает для буферов, если у вас нет локального файла (например, пользователю нужно загрузить аватар или что-то еще).
Я сталкиваюсь с той же проблемой при локальном тестировании приложения, но все работает, когда проект развернут.
Таким образом, я на самом деле использую следующий обходной путь:
if (!firebase.storage) {
// prevent crash when working locally
return;
}
let ref = firebase.storage().ref()
// perform production stuff ...
Это немного любопытно, но это работает в моем случае.
Похоже, они исправили это в новой версии библиотеки. Просто запустите npm update
для соответствующего пакета (ов), и оно должно работать.
Изменится ли это, если вы попытаетесь сделать это следующим образом?
// Initialize the default app:
const app = firebase.initializeApp(appConfig)
// Initialize storage from the *app* object:
const storage = app.storage()
Из документов кажется, что это альтернативный метод. Я предпочитаю это, поскольку это связывает хранилище с приложением, делая код более читаемым и более функциональным
var storage = app.storage();
Я получаю эту ошибку: TypeError: app.storage is not a function
... И я сделал это: var app = firebase.initializeApp(config);
перед рукой.
Firebase is not a function
. Их ошибка заключалась в том, что они не инициализировали Firebase должным образом, в то время как я это сделал, и смог использовать базу данных Firebase и другие функции соответственно. Проблема с Firebase Storage.