64 votes

TypeError : firebase.storage n'est pas une fonction

Suivant ce exemple, je continue à obtenir l'erreur :

 TypeError: firebase.storage is not a function

De cette ligne dans mon code :

var storageRef = firebase.storage().ref();

(Et lorsque j'essaie simplement d'initialiser le stockage à partir de l'application 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() entonces var ref = db.ref("/") ... Je sais donc que j'ai configuré Firebase et firebase-database correctement. Mais je suis bloqué sur storage et j'ai essayé les deux admin.storage().ref() y firebase.storage().ref() y 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 ref() L'argument de la nullité () et avec "/" ... mais ont le même message, en vain.

Je l'utilise :

  • "firebase" : "^3.6.4"
  • "firebase-admin" : "^4.0.4"
  • Node.js : v6.9.1

Que dois-je faire pour réussir à créer une référence au stockage ?

0 votes

2 votes

@SergChernata Non, c'est une erreur totalement différente. " Firebase is not a function . Leur erreur était qu'ils n'ont pas initialisé Firebase correctement, alors que je l'ai fait, et capable d'utiliser la base de données Firebase et d'autres fonctionnalités en conséquence. Le stockage Firebase est le problème.

0 votes

Que voyez-vous en inspectant le firebase.storage objet ? Essayez de faire console.log(JSON.stringify(firebase.storage)). Est-il indéfini ?

94voto

Ginpei Points 191

J'ai rencontré le même problème. Dans mon cas, j'avais besoin d'inclure un module de stockage en plus de Firebase core.

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

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

(npm firebase v5.0.4)

1 votes

Merci pour les commentaires. Je constate que 'firebase' n'a pas de membre exporté 'storage' avec firebase.storage().ref().

29voto

Nitai J. Perez Points 1

DÉCRYPTÉ, voir ci-dessous :

Selon cette réponse au lieu du stockage firebase, dans Node.js, google-cloud le stockage des paquets 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')

En 2018, c'est la bonne réponse :

Ou en utilisant uniquement la partie stockage du paquet :

npm install --save @google-cloud/storage

Et puis :

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

Vérifiez également les docs pour plus.

3 votes

J'ai déjà rencontré un avertissement... npm WARN deprecated gcloud@0.37.0: gcloud has been renamed to google-cloud. To get new features and bug fixes, you must use the new package. ... Je vais donc poster ceci pour garder l'information à jour... je travaille sur ce sujet maintenant, grâce à cette deuxième réponse...

0 votes

Corrigé la réponse pour refléter le changement. Merci !

1 votes

Je viens de trouver un obstacle majeur non annoncé... Vous devez activer la facturation pour utiliser un seau.

19voto

NonCreature0714 Points 1851

Déclassé : voir la réponse acceptée.

Quelques détails à noter :

  1. Firebase Storage n'est plus utilisé avec Node.js, donc toute la documentation est inutile pour Node.js. A la place, utilisez google-cloud . Les références et les guides pour Firebase et Google Cloud ne reflètent pas cela à ce jour.
  2. Contrairement à Firebase, google-cloud coûte cher, même pour les petits projets.
  3. Dans mon cas, j'utilise le firebase-admin SDK pour que je n'aie pas à m'occuper de l'authentification des utilisateurs pour le moment.

Objectif

Pour créer un projet Node.js unique qui utilise Firebase et Google Cloud. Pourquoi ? Firebase dispose d'une base de données utile, entre autres fonctionnalités, et Google Cloud permet de stocker et de récupérer des fichiers dans le nuage.

Directions

Étape 1 : Création du projet

Créer Firebase y Google Cloud (stockage) projets.

Étape 2 : Installer les paquets

Utilisation de npm , installer firebase-admin y google-cloud en Node.js projet.

Note 1 : J'ai utilisé le SDK d'administration, donc après avoir créé le projet Firebase, vous aurez besoin d'aller à :

  • Paramètres (l'engrenage) > Paramètres du projet > Comptes de service > Firebase Admin SDK
  • Alors vous : Sélectionnez Node.js > [Copier/coller le code généré dans votre projet] > [cliquez sur "Générer une nouvelle clé privée"] > [téléchargez le fichier généré json à l'emplacement souhaité] > [remplacer "path/to...AccountKey.json" avec le chemin vers la clé que vous venez de généré].

Note 2 : la clé générée peut être réutilisée dans les identifiants firebase ou google-cloud.

Étape 3 : Configuration de Firebase

Une fois que votre projet est 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, allez dans "Storage" dans Firebase, et notez l'URL qui commence par "database". gs: et le copier/coller 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 les instructions suivantes Documentation propre à Firebase .

Étape 4 : Configuration de la facturation Google-Cloud

Après avoir créé un projet sur Google Cloud, ajoutez les informations de facturation ; les buckets ne peuvent pas être utilisés sans les informations de facturation.

Étape 5 : Configuration du stockage Google-Cloud

  1. En faisant défiler le menu (les 3 barres horizontales), cliquez sur "Stockage", puis "Activer la facturation". Oui, vous avez ajouté les informations de facturation, maintenant vous devez les activer pour les seaux de ce projet.
  2. Vous devrait voir qu'un bucket devrait déjà exister dans votre projet Firebase.
  3. Cliquez à nouveau sur le menu (icône à 3 barres), puis sur >. IAM & Admin > Ajustes
  4. Dans les paramètres, vous verrez "Project ID" qui devrait ressembler à "projectName-00000" ou "projectName-Some#", copier l'ID du projet

Étape 6 : Google Cloud dans Node.js

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'
});

Maintenant, vous pouvez envoyer un fichier à votre stockage par :

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);
  }
});

Étape 7 : Vérifier

Si le fichier est visible dans Firebase Storage et Google Cloud Storage, vous avez terminé !

0 votes

Comment authentifier un utilisateur et lui servir ses fichiers pendant tout ce temps ?

0 votes

Si vous votez à la baisse parce que ce n'est pas une bonne réponse pour vous... alors veuillez vous référer à la toute première ligne de ma réponse, qui redirige les utilisateurs vers la bonne réponse. Je garde cette réponse ici pour la postérité.

1 votes

La réponse mise à jour est également obsolète, car "npm WARN deprecated google-cloud@0.58.2 : Le paquet google-cloud a été déprécié". Mais ne vous sentez pas mal, il semble que le propre document de Google soit encore PLUS obsolète.

7voto

Lorsque vous utilisez le stockage avec Firebase, vous avez raison de dire que vous ne pouvez pas ajouter des buckets sur le niveau gratuit. Cependant, vous obtenez un seau (un seul) par défaut. Mon approche (finalement) réussie était de :

  1. Ajouter le stockage à mon projet dans Firebase (PAS Google Cloud)

  2. Ajoutez le SDK Admin et configurez le compte de service nécessaire conformément aux documents Google : https://firebase.google.com/docs/admin/setup?authuser=1

  3. Ajouter le @google-cloud/storage conformément aux instructions relatives à l'utilisation du SDK Admin avec le stockage : https://firebase.google.com/docs/storage/admin/start?authuser=1

  4. Initialiser l'application :

    admin.initializeApp({
      credential: admin.credential.cert("/path/to/generated/json/here.json"),
      storageBucket: "folder-URL-from-Storage-page-excluding-gs://"
    });
  5. Accédez à l'objet "bucket" avec (à partir des documents du SDK Admin) :

    const bucket = admin.storage().bucket();

  6. 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 à croire que cela ne fonctionnait pas parce que je n'avais pas de seau. gs:// dans le chemin de mon seau de stockage lors de l'initialisation.

0 votes

Je reçois l'erreur "TypeError : admin.storage is not a function".

0 votes

Tushar crée une application sans le certificat de sécurité. Morgan, merci. C'est la bonne réponse. J'ajouterais que .save() fonctionne pour Buffers si vous n'avez pas le fichier localement (par exemple, l'utilisateur doit télécharger un avatar ou autre).

0 votes

Pour tous ceux qui cherchent à obtenir l'url publique : bucket.file('image.jpg').getSignedUrl({ action: 'read', expires: '03-09-2491' }).then(results => { let url = results[0]; }); Vous pouvez également trouver des détails ici : stackoverflow.com/questions/42956250/ github.com/googleapis/nodejs-storage/blob/master/samples/

0voto

Alexandre Points 11

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 en fait la solution de rechange 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.

0 votes

C'est très intéressant ! Dans mon cas, mon application a également été déployée, donc ce qui est intéressant c'est que cela fonctionne pour vous mais pas pour moi. Ma solution consistait à utiliser le stockage Google Cloud

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X