Свойство Angular2 не существует для типа

Я пытаюсь получить подключенную модель пользователя после входа в систему,

Сначала пользователь перенаправляет на URL-адрес "/ login" после того, как CanActivate guard проверил локальное хранилище с помощью пользовательского объекта JSON и обнаружил, что оно пустое.

Затем пользователь входит в систему и перенаправляет обратно на корневой URL-адрес "/", в процессе подключения я использую AuthService, который сохраняет объект пользователя, возвращенный с сервера, в пользовательской модели.

но я получаю эту ошибку:

src / app / _guards / auth.guard.ts (12,48): свойство 'token' не существует для типа 'User'.)

моя модель пользователя выглядит так:

export class User {
constructor(
    public email:string,
    public passowrd:string,
    public firstname:string,
    public lastname:string,
    public token:string
){}
}

и мой AuthService выглядит так:

import { Injectable } from '@angular/core';
import { User } from "../_models/user";
import { Observable } from 'rxjs/Rx';
import { Http, Headers, Response } from '@angular/http';
import { Router } from "@angular/router";
import 'rxjs/add/operator/map';

@Injectable()
export class AuthenticationService {
  private user: User;

  constructor(private http: Http,private router:Router) {
    // set token if saved in local storage
    var currentUser = JSON.parse(localStorage.getItem('currentUser'));
    this.user = currentUser;
  }

  getUser(){
    return this.user;
  }

    login(email:string,password:string): Observable<boolean> {
        const body = JSON.stringify({ email: email, password: password });
        const headers = new Headers({
         'Content-Type' : 'application/json'
        });

        return this.http.get("https://test.firebaseio.com/users.json",{headers:headers})
            .map(
            (response: Response) => {

                // login successful if there's a token in the response
                let token = response.json() && response.json().token;
                if(token){
                    // set user object
                    this.user = response.json();

                    // store username and jwt token in local storage to keep user logged in between page refreshes
                    localStorage.setItem('currentUser', JSON.stringify(this.user));

            // return true to indicate successful login
                    return true;
                } else {
                    // return false to indicate failed login
                    return false;
                }
                //return response.json();
            }
          );
    }

    logout(): void {
    // clear token remove user from local storage to log user out
    this.user = null;
    localStorage.removeItem('currentUser');
    this.router.navigate(['/']);
  }
}

и это моя охрана

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Rx';
import { AuthenticationService } from '../_services/index';

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(private router: Router,private authService:AuthenticationService) { }

    canActivate(route:ActivatedRouteSnapshot, state:RouterStateSnapshot): boolean {
        if (this.authService.getUser().token) {
            // logged in so return true
            return true;
        }

        this.router.navigate(['/login']);
        return false;
    }
}

2 ответа

Решение

Ваш метод входа не является статичным, это означает, что вы можете использовать вход только после того, как создали хотя бы один экземпляр AuthenticationService,

Ты устанавливаешь currentUser ни с чем в конструкторе. И вы не обновите его после входа в систему.

Чтобы это исправить, добавьте:

this.user = JSON.parse(localStorage.getItem('currentUser'));после localStorage.setItem('currentUser', JSON.stringify(this.user)); на линии 39.

Это, вероятно, это исправит, хотя мне это не нравится.

Недавно я сделал очень похожий код, и для решения этой проблемы я решил создать публичный метод, такой как:

  public getAuthKey() {
    return localStorage.getItem('currentUser');
  }

Таким образом, вы всегда будете уверены, что получите правильное значение, если оно есть.

В вашем пользовательском сервисном модуле поменяйте

getUser(){
    return this.user;
  }

public getUser(){
    return this.user;
  }
так что это доступно

Другие вопросы по тегам