Я пытаюсь понять, как загружать файлы в хранилище Firebase, используя Node.js. Моя первая попытка была использовать Firebase библиотека:Загрузите файлы в хранилище Firebase с помощью Node.js
"use strict";
var firebase = require('firebase');
var config = {
apiKey: "AIz...kBY",
authDomain: "em....firebaseapp.com",
databaseURL: "https://em....firebaseio.com",
storageBucket: "em....appspot.com",
messagingSenderId: "95...6"
};
firebase.initializeApp(config);
// Error: firebase.storage is undefined, so not a function
var storageRef = firebase.storage().ref();
var uploadTask = storageRef.child('images/octofez.png').put(file);
// Register three observers:
// 1. 'state_changed' observer, called any time the state changes
// 2. Error observer, called on failure
// 3. Completion observer, called on successful completion
uploadTask.on('state_changed', function(snapshot){
...
}, function(error) {
console.error("Something nasty happened", error);
}, function() {
var downloadURL = uploadTask.snapshot.downloadURL;
console.log("Done. Enjoy.", downloadURL);
});
Но оказывается, что Firebase не может загружать файлы на стороне сервера, как это четко сказано в документации:
Firebase Storage is not included in the server side Firebase npm module. Instead, you can use the gcloud Node.js client.
$ npm install --save gcloud
In your code, you can access your Storage bucket using:
var gcloud = require('gcloud')({ ... }); var gcs = gcloud.storage(); var bucket = gcs.bucket('<your-firebase-storage-bucket>');
Может мы используем
gcloud
без учета в Google Cloud Platform? Как?В противном случае, возможно ли, что загрузка файлов в хранилище Firebase с клиентской стороны возможна?
Не можем ли мы создать библиотеку, которая делает те же запросы со стороны сервера?
Как хранилище Firebase связано с облачной платформой Google? Почему Firebase позволяет загружать изображения только со стороны клиента?
Моя вторая попытка была использовать gcloud
библиотеку, как упоминалось в документации:
var gcloud = require("gcloud");
// The following environment variables are set by app.yaml when running on GAE,
// but will need to be manually set when running locally.
// The storage client is used to communicate with Google Cloud Storage
var storage = gcloud.storage({
projectId: "em...",
keyFilename: 'auth.json'
});
storage.createBucket('octocats', function(err, bucket) {
// Error: 403, accountDisabled
// The account for the specified project has been disabled.
// Create a new blob in the bucket and upload the file data.
var blob = bucket.file("octofez.png");
var blobStream = blob.createWriteStream();
blobStream.on('error', function (err) {
console.error(err);
});
blobStream.on('finish', function() {
var publicUrl = `https://storage.googleapis.com/${bucket.name}/${blob.name}`;
console.log(publicUrl);
});
fs.createReadStream("octofez.png").pipe(blobStream);
});
Это было очень полезно, но тем не менее, корень проблемы все же есть: я не могу загрузить вещи, используя 'gcloud' (например, создание ведра), потому что, согласно [этому ответу] (http://stackoverflow.com/a/23136508/1420197), я не разрешил выставление счетов. Опять же, почему доступ к хранилищу через 'gcloud' потребует биллинга при доступе к нему через firebase на стороне клиента, не будет? Благодаря! –
Я добавил еще один фрагмент моего вопроса. –
Кажется, вам, возможно, потребуется включить выставление счетов, это правда.Я сообщаю команде внутренне. Всегда есть дебаты о том, следует ли нам создать специальный серверный SDK для Firebase для хранилища, и на данный момент консенсус «нет». Для проблемы с выставлением счетов: в качестве обходного пути вы можете включить выставление счетов и установить бюджет с лимитом нулевого доллара США, чтобы избежать получения каких-либо счетов. Сам API должен быть свободен в использовании, а ведро, которое использует Firebase Storage, имеет свободную квоту, поэтому все должно работать. – Nivco