impossible d’afficher le nom d’utilisateur en mode angular

J’ai implémenté l’authentification à l’aide de la création de jetons JWT et après la connexion, je souhaite afficher le nom d’utilisateur sur la barre de navigation, mais cela ne montre rien et donne une erreur sur la console. “ERREUR TypeError: Impossible de lire la propriété ‘nom d’utilisateur’ de non définie” montrant le nom d’utilisateur et donnant toujours la même erreur sur la console.

Voici mon code

NavbarComponent.ts

import { Component, OnDestroy } from '@angular/core'; import { AuthService } from '../../services/auth.service'; import { Router } from '@angular/router'; import { User } from '../../shared/user'; import { Observable } from 'rxjs/Observable'; import { of } from 'rxjs/observable/of'; import { AdminAuthGuard } from '../../guards/admin.auth.guard'; import { Subscription } from 'rxjs/Subscription'; @Component({ selector: 'app-navbar', templateUrl: './navbar.component.html', styleUrls: ['./navbar.component.css'] }) export class NavbarComponent { user$: any; constructor(private authService: AuthService, private router: Router, private adminGuard: AdminAuthGuard) { this.authService.getProfile().subscribe((user) => { console.log('fsdf' + user.user.email); this.user$ = user.user; }); } onLogoutClick() { // console.log('this.user' + this.user$.email); this.authService.logout(); this.router.navigate(['/']); } } 

Le code html dans lequel j’imprime le nom d’utilisateur.

Le code du service d’authentification. Focus sur la méthode getProfile ()

 import { Injectable } from '@angular/core'; import 'rxjs/add/operator/map'; import { Http, Headers, RequestOptions } from '@angular/http'; // import { map } from "rxjs/operators"; // import { map } from 'rxjs/operators'; import { switchMap } from 'rxjs/operators'; import { tokenNotExpired } from 'angular2-jwt'; import { User } from '../shared/user'; import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Subject'; import 'rxjs/add/observable/of'; @Injectable() export class AuthService { private subject = new Subject(); domain = 'http://localhost:3000'; authToken; user; options; constructor(private http: Http) { } registerUser(user) { return this.http.post(this.domain + '/authentication/register', user).map(res => res.json()); } createAuthenticationHeaders() { this.loadToken(); this.options = new RequestOptions({ headers : new Headers({ 'Content-Type': 'application/json', 'authorization': this.authToken }) }); } loadToken() { this.authToken = localStorage.getItem('token'); } checkUsername(username) { return this.http.get(this.domain + '/authentication/checkUsername/' + username).map(res => res.json()); } checkEmail(email) { return this.http.get(this.domain + '/authentication/checkEmail/' + email).map(res => res.json()); } login(user) { return this.http.post(this.domain + '/authentication/login', user).map(res => res.json()); } logout() { this.authToken = null; this.user = null; localStorage.clear(); } storeUserData(token, user) { localStorage.setItem('token', token); localStorage.setItem('user', JSON.ssortingngify(user)); this.authToken = token; this.user = user; } getProfile() { this.createAuthenticationHeaders(); return this.http.get(this.domain + '/authentication/profile', this.options).map(res => res.json()); } loggedIn() { return tokenNotExpired(); } } 

C’est l’API http routée qui récupère l’utilisateur de la firebase database mongodb écrite dans Node.js. Concentrez-vous sur la méthode get () pour ‘/ profile’, elle renvoie un observable.

 const User = require('../models/user'); // Import User Model Schema const jwt = require('jsonwebtoken'); const config = require('../config/database'); module.exports = (router) => { /* ============== Register Route ============== */ router.post('/register', (req, res) => { // Check if email was provided if (!req.body.email) { res.json({ success: false, message: 'You must provide an e-mail' }); // Return error } else { // Check if username was provided if (!req.body.username) { res.json({ success: false, message: 'You must provide a username' }); // Return error } else { // Check if password was provided if (!req.body.password) { res.json({ success: false, message: 'You must provide a password' }); // Return error } else { // Create new user object and apply user input let user = new User({ email: req.body.email.toLowerCase(), username: req.body.username.toLowerCase(), password: req.body.password }); // Save user to database user.save((err) => { // Check if error occured if (err) { // Check if error is an error indicating duplicate account if (err.code === 11000) { res.json({ success: false, message: 'Username or e-mail already exists' }); // Return error } else { // Check if error is a validation rror if (err.errors) { // Check if validation error is in the email field if (err.errors.email) { res.json({ success: false, message: err.errors.email.message }); // Return error } else { // Check if validation error is in the username field if (err.errors.username) { res.json({ success: false, message: err.errors.username.message }); // Return error } else { // Check if validation error is in the password field if (err.errors.password) { res.json({ success: false, message: err.errors.password.message }); // Return error } else { res.json({ success: false, message: err }); // Return any other error not already covered } } } } else { res.json({ success: false, message: 'Could not save user. Error: ', err }); // Return error if not related to validation } } } else { res.json({ success: true, message: 'Acount registered!' }); // Return success } }); } } } }); router.get('/checkEmail/:email', (req, res) => { if (!req.params.email) { res.json({ success: false, message: 'email not provided'}); } else { User.findOne({ email: req.params.email}, (err, user) => { if (err) { res.json({ success: false, message: err}); } else { if (user) { res.json({ success: false, message: 'email taken'}); } else { res.json({ success: true, message: 'email available'}); } } }); } }); router.get('/checkUsername/:username', (req, res) => { if (!req.params.username) { res.json({ success: false, message: 'username not provided'}); } else { User.findOne({ username: req.params.username}, (err, user) => { if (err) { res.json({ success: false, message: err}); } else { if (user) { res.json({ success: false, message: 'username taken'}); } else { res.json({ success: true, message: 'username available'}); } } }); } }); router.post('/login', (req, res) => { if (!req.body.username) { res.json({ success: false, message: 'No username was provided'}); } else { if (!req.body.password) { res.json({ success: false, message: 'No password was provided'}); } else { User.findOne({ username: req.body.username.toLowerCase() }, (err, user) => { if (err) { res.json({ success: false, message: err}); } else { if (!user) { res.json({ success: false, message: 'No user exist'}); } else { const validPassword = user.comparePassword(req.body.password); if (!validPassword) { res.json({ success: false, message: 'password invalid'}); } else { const token = jwt.sign({userId: user._id}, config.secret, {expiresIn: '24h'}); res.json({ success: true, message: 'Success!', token: token, user: {username: user.username}}); } } } }); } } }); // MIDDLEWARE TO INTERCEPT HEADERS // THIS MIDDLEWARE DECRYPTS THE TOKEN router.use((req, res, next) => { const token = req.headers['authorization']; // whenever a request coming from angular2 with headers attached it is going to search fot this header if (!token) { res.json({ success: false, message: 'No token provided'}); } else { jwt.verify(token, config.secret, (err, decoded) => { if (err) { res.json({ success: false, message: 'invalid token' + err}); } else { req.decoded = decoded; next(); } }); } }) // ANY ROUTES COMING AFTER THIS MIDDLEWARE WILL PASS THROUGH THE SAME // BELOW METHOD TAKES THE DECRYPTED TOKEN FIND THE USER router.get('/profile', (req, res) => { User.findOne({ _id: req.decoded.userId }).select('username email isAdmin').exec((err, user) => { if (err) { res.json({ success: false, message: err}); } else { if (!user) { res.json({ success: false, message: 'user not found'}); } else { res.json({ success: true, user: user }); } } }); }); return router; // Return router object to main index.js } 

Essayez d’utiliser safe navigation operator ou * ngIf puisque vous envoyez une demande à votre API et obtenez les données de manière asynchrone. Essayez comme suit,

   

Je suis presque sûr que cela vous arrive parce que vous essayez d’accéder à l’ utilisateur $ .username lorsque la propriété nom_utilisateur n’existe pas. Pour éviter cette erreur, vous pouvez utiliser un type défini puis initialiser, par exemple.

 public $user: UserInterface = { username: '' } 

ou si vous ne voulez pas utiliser de types définis, ajoutez simplement une validation supplémentaire au bloc HTML en utilisant ngIf, par exemple.

  

Au fait, en tant que bonne pratique de codage, utilisez une déclaration de méthode publique pour les méthodes partagées par le code et la vue. Aucune construction ne sera possible grâce à vous.