Après this exemple, je continue à avoir l'erreur:
TypeError: firebase.storage is not a function
De cette ligne dans mon code:
var storageRef = firebase.storage().ref();
(Et quand j'essaye simplement d'initialiser le stockage à partir du guide de stockage , lié à site npm de firebase , j'obtiens la même erreur.)
Dans mon projet Node.js, j'inclus les bibliothèques suivantes:
const firebase = require('firebase');
var admin = require('firebase-admin');
const fs = require('fs');
Jusqu'à présent, j'ai réussi à lire et à écrire dans la base de données Firebase, en créant une référence à la base de données avec var db = admin.database()
, puis var ref = db.ref("/")
... Je sais donc J'ai correctement configuré Firebase et firebase-database. Mais je suis bloqué sur storage
et j'ai essayé à la fois admin.storage().ref()
et firebase.storage().ref()
, et firebase.storage().ref("/")
avec le même message d'erreur.
J'ai aussi essayé:
var storage = firbase.storage();
var storageRef = storage.ref();
et
const app = firebase.initializeApp(config);
var storage = app.storage();
et avec l'argument void de ref()
()
et avec "/"
... mais le même message n'a pas abouti.
J'utilise:
Que dois-je faire pour créer avec succès une référence au stockage?
DEPRECTED, voir ci-dessous:
Selon cette réponse , au lieu du stockage firebase, dans Node.js, google-cloud
package de stockage devrait être utilisé, et il semble que cette réponse devrait le confirmer. Exemple de code:
npm i --save google-cloud
Ensuite:
const gcloud = require('google-cloud')
const storage = gcloud.storage({
projectId: '<projectID>',
keyFilename: 'service-account-credentials.json',
});
const bucket = storage.bucket('<projectID>.appspot.com')
À compter de 2018, voici la réponse correcte:
Ou en utilisant uniquement la partie stockage du package:
npm install --save @google-cloud/storage
Et alors:
var storage = require('@google-cloud/storage')
Vérifiez également la documentation pour plus.
google-cloud
. Les références et guides de Firebase et Google Cloud ne reflètent pas cela à ce jour.firebase-admin
SDK, je n'ai donc pas à me soucier de l'authentification de l'utilisateur pour le moment.Pour créer un seul projet Node.js utilisant Firebase et Google Cloud. Pourquoi Firebase dispose d’une base de données utile, entre autres fonctionnalités, et Google Cloud permet le stockage et la récupération de fichiers dans le nuage.
Créez des projets Firebase et Google Cloud (stockage) .
En utilisant npm , installez firebase-admin
et google-cloud
dans Node.js
projet.
Note 1: J'ai utilisé le SDK administrateur. Ainsi, après avoir créé le projet Firebase, vous devrez accéder à:
Node.js
> [Copiez/collez le code généré dans votre projet]> [cliquez sur "Générer une nouvelle clé privée"]> [téléchargez le json
généré dans l'emplacement préféré]> [remplacez "path/to...AccountKey.json"
avec le chemin de la clé que vous venez de générer]Remarque 2: la clé générée peut être réutilisée dans les informations d'identification firebase ou google-cloud.
Une fois votre projet créé, importez le firebase-admin
sdk:
Le code devrait ressembler à ceci, mais rempli avec vos informations:
var admin = require("firebase-admin");
admin.initializeApp({
credential: admin.credential.cert("/path/to/generated/json/here.json"),
databaseURL: "database-url-from-firebase"
});
Pour trouver l'URL de la base de données, accédez à "Stockage" dans Firebase et notez l'URL commençant par gs:
et copiez/collez-le dans le champ de valeur de databaseURL.
Ensuite, obtenez une référence à la base de données que vous pouvez utiliser:
var db = admin.database();
var ref = db.ref("/");
console.log('DB ref: ' + ref); //just to debug, if undefined, there's a problem.
Pour en savoir plus sur la lecture/écriture dans la base de données, suivez la propre documentation de Firebase .
Après avoir créé un projet sur Google Cloud, ajoutez des informations de facturation. les seaux ne peuvent pas être utilisés sans informations de facturation.
Dans votre 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'
});
Vous pouvez maintenant envoyer un fichier sur votre stockage en:
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);
}
});
Si le fichier est visible dans Firebase Storage et Google Cloud Storage, vous avez terminé!
J'ai rencontré le même problème. Dans mon cas, je devais inclure un module de stockage en plus du noyau de Firebase.
import firebase from 'firebase';
import 'firebase/storage'; // <----
firebase.initializeApp({
...
});
const storageRef = firebase.storage().ref();
(npm firebase v5.0.4)
Lorsque vous utilisez Storage with Firebase, vous avez raison de ne pas ajouter de compartiments au niveau libre. Cependant, vous obtenez un seau (un seul) par défaut. Mon approche (finalement) réussie a été de:
Ajouter un stockage à mon projet dans Firebase (PAS Google Cloud)
Ajoutez le SDK administrateur et configurez le compte de service nécessaire conformément aux documents Google: https://firebase.google.com/docs/admin/setup?authuser=1
Ajoutez le package @google-cloud/storage
En suivant les instructions d'utilisation du SDK d'administration avec stockage: https://firebase.google.com/docs/storage/admin/start?authuser=1
Initialiser l'application:
admin.initializeApp({
credential: admin.credential.cert("/path/to/generated/json/here.json"),
storageBucket: "folder-URL-from-Storage-page-excluding-gs://"
});
Accédez à l'objet compartiment avec (à partir de la documentation du SDK d'administration):
const bucket = admin.storage().bucket();
Opérer sur le seau avec la bibliothèque de stockage. Exemple:
bucket.upload('/path/file.ext', function(err, file, apiResponse) {
//Do Stuff
});
REMARQUE: J'ai passé quelques heures à être convaincu que cela ne fonctionnait pas, car je n'avais pas de compartiment, mais l'erreur s'est finalement traduite par l'inclusion du gs://
Dans le chemin d'accès à mon compartiment de stockage lors de l'initialisation.
Je rencontre le même problème lorsque je teste mon application localement, mais tout fonctionne lorsque le projet est déployé.
De cette façon, j'utilise la solution suivante:
if (!firebase.storage) {
// prevent crash when working locally
return;
}
let ref = firebase.storage().ref()
// perform production stuff ...
C'est un peu curieux, mais ça marche dans mon cas.
On dirait qu'ils l'ont corrigé dans une nouvelle version de la bibliothèque. Il suffit de courir npm update
sur le (s) paquet (s) concerné (s) et cela devrait fonctionner.
Cela change-t-il si vous essayez de le faire comme suit?
// Initialize the default app:
const app = firebase.initializeApp(appConfig)
// Initialize storage from the *app* object:
const storage = app.storage()
D'après la documentation , il semble que ce soit une méthode alternative. Je préfère celui-ci, car cela relie le stockage à l'application, ce qui rend le code plus lisible et plus fonctionnel.