LocalStorage 在 setitem 后显示未定义
LocalStorage showing undefined after setitem
我在进行用户身份验证时将项目存储在 localstorage 上。在签入 localstorage
时存储项目未定义
在我的服务文件中:-
import { Result } from '../models/user';
dt: number = new Date().getTime();
loginForm(data: any): Observable<any> {
return this.http
.post(`${environment.baseUrl}/api/login`, data, this.httpOptions)
.pipe(
retry(2),
catchError(this.handleError)
);
}
setUser(resp: Result) {
localStorage.setItem('username', JSON.stringify(resp.UserName));
localStorage.setItem('token', JSON.stringify(resp.BearerToken));
localStorage.setItem('lastVisit', String(this.dt));
localStorage.setItem('storeids', JSON.stringify(resp.StoreIds));
this.router.navigate(['/home']);
}
型号:-
export interface Result {
UserName: string;
StoreIds: string;
BearerToken: string;
}
export interface RootObject {
IsSuccess: boolean;
ErrorMsg: string;
ErrorCode?: any;
Result: Result[];
}
我哪里错了?
编辑:-
组件登录:-
login() {
if (this.myGroup.valid) {
this.authService.loginForm(this.myGroup.value).subscribe(response => {
if (response.IsSuccess == true) {
console.log(response);
this.authService.setUser(response);
}
}, error => {
console.error(error);
});
} else {
alert("error ! login failed");
}
}
在登录中必须进行哪些更改? setUser (response)
错误为 Argument of type 'RootObject' is not assignable to parameter of type 'Result'.
setUser()
函数究竟在哪里被调用?理想情况下,它将在通过管道传输到 HTTP 请求的 tap
运算符中调用(将详细信息存储在本地存储中作为副作用)。
loginForm(data: any): Observable<any> {
return this.http.post(
`${environment.baseUrl}/api/login`,
data,
this.httpOptions
).pipe(
tap((resp: Result) => this.setUser(resp)),
retry(2),
catchError(this.handleError)
);
}
更新:类型
鉴于响应的类型为 RootObject
而不是 Result
,类型必须按以下方式更改
loginForm(data: any): Observable<RootObject> { // <-- Observable of type `RootObject`
return this.http.post<RootObject>(
`${environment.baseUrl}/api/login`,
data,
this.httpOptions
).pipe(
tap((resp: RootObject) => this.setUser(resp.Result[0] as Result)),
retry(2),
catchError(this.handleError)
);
}
现在我们发送 Result
数组的第一个元素。但是,如果响应只包含一个元素,为什么它是一个数组呢?也许必须在后端将其调整为 return 对象而不是数组。
我在进行用户身份验证时将项目存储在 localstorage 上。在签入 localstorage
时存储项目未定义在我的服务文件中:-
import { Result } from '../models/user';
dt: number = new Date().getTime();
loginForm(data: any): Observable<any> {
return this.http
.post(`${environment.baseUrl}/api/login`, data, this.httpOptions)
.pipe(
retry(2),
catchError(this.handleError)
);
}
setUser(resp: Result) {
localStorage.setItem('username', JSON.stringify(resp.UserName));
localStorage.setItem('token', JSON.stringify(resp.BearerToken));
localStorage.setItem('lastVisit', String(this.dt));
localStorage.setItem('storeids', JSON.stringify(resp.StoreIds));
this.router.navigate(['/home']);
}
型号:-
export interface Result {
UserName: string;
StoreIds: string;
BearerToken: string;
}
export interface RootObject {
IsSuccess: boolean;
ErrorMsg: string;
ErrorCode?: any;
Result: Result[];
}
我哪里错了?
编辑:-
组件登录:-
login() {
if (this.myGroup.valid) {
this.authService.loginForm(this.myGroup.value).subscribe(response => {
if (response.IsSuccess == true) {
console.log(response);
this.authService.setUser(response);
}
}, error => {
console.error(error);
});
} else {
alert("error ! login failed");
}
}
在登录中必须进行哪些更改? setUser (response)
错误为 Argument of type 'RootObject' is not assignable to parameter of type 'Result'.
setUser()
函数究竟在哪里被调用?理想情况下,它将在通过管道传输到 HTTP 请求的 tap
运算符中调用(将详细信息存储在本地存储中作为副作用)。
loginForm(data: any): Observable<any> {
return this.http.post(
`${environment.baseUrl}/api/login`,
data,
this.httpOptions
).pipe(
tap((resp: Result) => this.setUser(resp)),
retry(2),
catchError(this.handleError)
);
}
更新:类型
鉴于响应的类型为 RootObject
而不是 Result
,类型必须按以下方式更改
loginForm(data: any): Observable<RootObject> { // <-- Observable of type `RootObject`
return this.http.post<RootObject>(
`${environment.baseUrl}/api/login`,
data,
this.httpOptions
).pipe(
tap((resp: RootObject) => this.setUser(resp.Result[0] as Result)),
retry(2),
catchError(this.handleError)
);
}
现在我们发送 Result
数组的第一个元素。但是,如果响应只包含一个元素,为什么它是一个数组呢?也许必须在后端将其调整为 return 对象而不是数组。