J'essaie d'accéder à firebase.storage () sur mon projet, avec:
J'ai trouvé ceci solution , et créé mon fichier .component.ts avec:
import { Component } from '@angular/core';
declare var firebase : any;
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor() {
const storageRef = firebase.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
et j'obtiens l'erreur suivante dans la console du navigateur:
EXCEPTION: Error: Uncaught (in promise): EXCEPTION: Error in ./bstorageComponent class FBStorageComponent_Host - inline template:0:0
ORIGINAL EXCEPTION: Error: No Firebase App '[DEFAULT]' has been created - call Firebase App.initializeApp().
ORIGINAL STACKTRACE:
Error: No Firebase App '[DEFAULT]' has been created - call Firebase App.initializeApp().
mais j'ai initialisé firebase dans app.module.ts avec cette importation
AngularFireModule.initializeApp(firebaseConfig)
Je n'obtiens pas ce qui me manque. Comment puis-je accéder au stockage à l'aide de Firebase? Je n'ai aucun problème avec l'accès à la base de données avec angularfire2.
Merci
En interne, AngularFire2 appelle initializeApp
de Firebase dans une fabrique DI lors de la création de son FirebaseApp
.
Vous voyez l'erreur car vous accédez à l'instance globale firebase
et initializeApp
n'a pas encore été appelée - car l'infrastructure DI n'a pas eu besoin de créer FirebaseApp
ou l'une de ses dépendances.
Plutôt que d'utiliser la fonction globale firebase
, vous pouvez injecter FirebaseApp
(qui est la valeur renvoyée par la fonction initializeApp
de Firebase):
import { Component, Inject } from '@angular/core';
import { FirebaseApp } from 'angularfire2';
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor(@Inject(FirebaseApp) firebaseApp: any) {
const storageRef = firebaseApp.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
Et, comme il n'est plus nécessaire, vous pouvez supprimer declare var firebase : any;
.
Les premières versions du module NPM Firebase n'incluaient pas de typages. Les versions récentes les incluent maintenant, donc la propriété firebaseApp
pourrait être fortement typée comme ceci:
import { Component, Inject } from '@angular/core';
import { FirebaseApp } from 'angularfire2';
import * as firebase from 'firebase';
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor(@Inject(FirebaseApp) firebaseApp: firebase.app.App) {
const storageRef = firebaseApp.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
Avec le refactoring qui accompagnait la version 4 candidate candidate d'AngularFire2, FirebaseApp
n'est plus un token, donc l'injection peut être simplifiée:
import { Component, Inject } from '@angular/core';
import { FirebaseApp } from 'angularfire2';
import 'firebase/storage';
@Component({
template: '<img [src]="image">'
})
export class RecipesComponent {
image: string;
constructor(firebaseApp: FirebaseApp) {
const storageRef = firebaseApp.storage().ref().child('images/image.png');
storageRef.getDownloadURL().then(url => this.image = url);
}
}
Cependant, une importation explicite de firebase/storage
est requis car AngularFire2 importe désormais uniquement les parties de l'API Firebase qu'il utilise. (Notez qu'il existe une proposition pour support de stockage .)
Le code ci-dessus ne fonctionne plus, je continue à obtenir "firebase.storage n'est pas une fonction", essayez d'ajouter le code suivant:
import * as firebase from 'firebase/app';
import 'firebase/storage';