2016-10-04 6 views
16

Я пытаюсь понять, как загружать файлы в хранилище 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); 
}); 

ответ

14

При использовании firebase библиотеки на сервере вы обычно разрешаю using a service account как это даст например, вы можете получить доступ к базе данных Realtime. Вы можете использовать тот же файл учетных данных учетной записи службы authorize gcloud.

Кстати: а Firebase проект, по сути, также проект Google Cloud Platform, вы можете получить доступ к проекту Firebase на обоих https://console.firebase.google.com и https://console.cloud.google.com и https://console.developers.google.com Вы можете увидеть свой идентификатор проекта на Firebase Console > Project Settings или в Cloud Console Dashboard

При использовании gcloud SDK убедитесь, что вы используете (уже существующее) такое же ведро, что и Firebase Storage. Имя ведра можно найти в объекте Firebase web config или на вкладке «Хранилище Firebase». В основном ваш код должен начинаться примерно так:

var gcloud = require('gcloud'); 

var storage = gcloud.storage({ 
    projectId: '<projectID>', 
    keyFilename: 'service-account-credentials.json' 
}); 

var bucket = storage.bucket('<projectID>.appspot.com'); 

... 
+0

Это было очень полезно, но тем не менее, корень проблемы все же есть: я не могу загрузить вещи, используя 'gcloud' (например, создание ведра), потому что, согласно [этому ответу] (http://stackoverflow.com/a/23136508/1420197), я не разрешил выставление счетов. Опять же, почему доступ к хранилищу через 'gcloud' потребует биллинга при доступе к нему через firebase на стороне клиента, не будет? Благодаря! –

+0

Я добавил еще один фрагмент моего вопроса. –

+0

Кажется, вам, возможно, потребуется включить выставление счетов, это правда.Я сообщаю команде внутренне. Всегда есть дебаты о том, следует ли нам создать специальный серверный SDK для Firebase для хранилища, и на данный момент консенсус «нет». Для проблемы с выставлением счетов: в качестве обходного пути вы можете включить выставление счетов и установить бюджет с лимитом нулевого доллара США, чтобы избежать получения каких-либо счетов. Сам API должен быть свободен в использовании, а ведро, которое использует Firebase Storage, имеет свободную квоту, поэтому все должно работать. – Nivco

2

Обратите внимание, что gcloud устарел, вместо этого используйте google-cloud. Вы можете найти SERVICE_ACCOUNT_KEY_FILE_PATH в настройках проекта -> Учетные записи служб.

var storage = require('@google-cloud/storage'); 

var gcs = storage({ 
    projectId: PROJECT_ID, 
    keyFilename: SERVICE_ACCOUNT_KEY_FILE_PATH 
    }); 

// Reference an existing bucket. 
var bucket = gcs.bucket(PROJECT_ID + '.appspot.com'); 

... 
7

Firebase хранения теперь поддерживается админ SDK с NodeJS:

https://firebase.google.com/docs/reference/admin/node/admin.storage

// Get the Storage service for the default app 
var defaultStorage = firebaseAdmin.storage(); 
var bucket = defaultStorage.bucket('bucketName'); 
... 
+0

Когда я пытаюсь это сделать, я получаю 'TypeError: defaultStorage не является функцией'. С последней библиотекой «firebase-admin» npm. –

+0

'var bucket = firebaseAdmin.storage(). Bucket ('bucketName');' - это делает трюк, следуя этому в качестве руководства: https://firebase.google.com/docs/storage/admin/start#use_a_custom_firebase_app –

Смежные вопросы