web-dev-qa-db-fra.com

TypeError: firebase.storage n'est pas une fonction

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:

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

Que dois-je faire pour créer avec succès une référence au stockage?

36
NonCreature0714

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.

24
Selfish

Quelques détails à noter:

  1. Firebase Storage n'est plus utilisé avec Node.js, donc toute la documentation y est inutile pour Node.js. Utilisez plutôt google-cloud. Les références et guides de Firebase et Google Cloud ne reflètent pas cela à ce jour.
  2. Contrairement à Firebase, google-cloud coûte de l’argent, même pour de petits projets.
  3. Dans mon cas, j'utilise le firebase-admin SDK, je n'ai donc pas à me soucier de l'authentification de l'utilisateur pour le moment.

Objectif

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.

Instructions

Étape 1: Création du projet

Créez des projets Firebase et Google Cloud (stockage) .

Étape 2: Installer les packages

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 à:

  • Paramètres (le matériel)> Paramètres du projet> Comptes de service> Kit de développement Firebase Admin
  • Ensuite, vous: Sélectionnez 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.

Étape 3: Configuration de Firebase

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 .

Étape 4: Configuration de la facturation Google-Cloud

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.

Étape 5: Configuration de Google-Cloud Storage

  1. En parcourant le menu (les 3 barres horizontales), cliquez sur "Stockage", puis sur "Activer la facturation". Oui, vous avez ajouté des informations de facturation. Vous devez maintenant l'activer pour les compartiments de ce projet.
  2. Vous devriez voyez qu'un compartiment devrait déjà exister à partir de votre projet Firebase.
  3. Cliquez à nouveau sur le menu (icône à 3 barres), puis> IAM & Admin> Paramètres
  4. Dans les paramètres, vous verrez "ID du projet" qui devrait ressembler à "nom du projet-00000" ou "nom du projet-quelque #", copier cet ID de 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'
});

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

Étape 7: vérifier

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

18
NonCreature0714

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)

17
Ginpei

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:

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

  2. 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

  3. 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

  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 compartiment avec (à partir de la documentation du SDK d'administration):

    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 à ê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.

5

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.

1
Alexandre

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.

0
Ivan Rubinson

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.

0
Selfish