Angular2 属性 类型不存在
Angular2 Property does not exist on type
我正在尝试在登录过程后获取已连接的用户模型,
首先,在 CanActivate 守卫用用户 JSON 对象检查本地存储并发现它为空后,用户重定向到“/login”URL
然后用户登录并重定向回 root 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;
}
}
您的登录方法不是静态的,这意味着您只能在创建至少一个 AuthenticationService
.
实例后才能使用登录
您在构造函数中没有设置 currentUser
。而且你登录后不更新。
为了修复它,添加:
this.user = JSON.parse(localStorage.getItem('currentUser'));
在第 39 行 localStorage.setItem('currentUser', JSON.stringify(this.user));
之后。
这可能会解决它,即使我不喜欢它。
我最近编写了一个非常相似的代码,我针对这个确切问题的解决方案是创建一个 public 方法,例如:
public getAuthKey() {
return localStorage.getItem('currentUser');
}
这样您将始终确保获得正确的值(如果有的话)。
在你的用户服务模块中更改
getUser(){
return this.user;
}
` 到
public getUser(){
return this.user;
}
以便它可以访问
我正在尝试在登录过程后获取已连接的用户模型,
首先,在 CanActivate 守卫用用户 JSON 对象检查本地存储并发现它为空后,用户重定向到“/login”URL
然后用户登录并重定向回 root 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;
}
}
您的登录方法不是静态的,这意味着您只能在创建至少一个 AuthenticationService
.
您在构造函数中没有设置 currentUser
。而且你登录后不更新。
为了修复它,添加:
this.user = JSON.parse(localStorage.getItem('currentUser'));
在第 39 行 localStorage.setItem('currentUser', JSON.stringify(this.user));
之后。
这可能会解决它,即使我不喜欢它。
我最近编写了一个非常相似的代码,我针对这个确切问题的解决方案是创建一个 public 方法,例如:
public getAuthKey() {
return localStorage.getItem('currentUser');
}
这样您将始终确保获得正确的值(如果有的话)。
在你的用户服务模块中更改
getUser(){
return this.user;
}
` 到
public getUser(){
return this.user;
}