gpt4 book ai didi

angular - 错误 TS2345 Angular AngularFire2 检查用户是否为 Admin

转载 作者:行者123 更新时间:2023-12-05 08:17:21 25 4
gpt4 key购买 nike

尝试使用最新版本的 Firebase 和 Angular。我试图实现的总体概念是管理员身份验证。我已经实现了登录注销功能。我已使用 UID 将 googleAuth 登录用户保存到数据库中。现在我要做的是将某些页面限制为登录和管理。因此,我已将 isAdmin: true 指定为存储在数据库中的用户对象中的值。基本上我想看看用户是否是管理员并为路由器参数返回 true 或 false。我一直断断续续地使用 Angular 和 Firebase。我会认为自己是初学者。我不太明白如何从 AngularFire2 4 -> AngularFire 5 迁移。我得到的当前错误是 TS2345:

ERROR in src/app/admin-auth-guard.service.ts(15,38): error TS2345: Argument of type '(user: User) => AngularFireObject<AppUser>' is not assignable to parameter of type '(value: User, index: number) => ObservableInput<{}>'.
Type 'AngularFireObject<AppUser>' is not assignable to type 'ObservableInput<{}>'.
Type 'AngularFireObject<AppUser>' is not assignable to type 'ArrayLike<{}>'.
Property 'length' is missing in type 'AngularFireObject<AppUser>'.

据我所知,get 函数正在返回一个对象,但错误是期望一个可观察对象。我对 Observables 的全部了解是你可以订阅它们并且你应该销毁它们......

我需要使用当前登录的用户 ID 来查询数据库并返回与 uid 匹配的用户对象,然后检查 isAdmin 是 true 还是 false。然后将其返回到路由参数,这样我就可以将页面限制为经过身份验证和管理。

请指出正确的方向。

admin-auth-guard.service.ts

import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { UserService } from './user.service';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class AdminAuthGuardService implements CanActivate {

constructor(private auth: AuthService, private userService: UserService) { }

canActivate(): Observable<boolean> {
return this.auth.user$.switchMap(user => this.userService.get(user.uid)).map(appUser => appUser.isAdmin);
}

}

用户服务.ts

import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import * as firebase from 'firebase';
import { Observable } from 'rxjs/Observable';
import { AppUser } from './models/app-user';

@Injectable()
export class UserService {

constructor(private db: AngularFireDatabase) { }

save(user: firebase.User) {
this.db.object('/users/' + user.uid).update({
name: user.displayName,
email: user.email
});
}

get(uid: string): AngularFireObject<AppUser> {
return this.db.object('/users/' + uid);
}

}

这是我一直在使用的帮助:https://github.com/angular/angularfire2/blob/master/docs/version-5-upgrade.md

我不明白注解是如何为创建的函数工作的。关于“可观察的”,我假设这意味着这个 canActivate() 函数从一个可观察的对象扩展而来,应该返回一个 bool 值(真/假)。

感谢您的宝贵时间。

最佳答案

 get(uid: string): Observable<any> {
return this.db.object('/users/' + uid).valueChanges();
}

和:

canActivate(): Observable<boolean> {
return this.auth.user$.switchMap(user =>
this.userService.get(user.uid)).map((appUser :any) => appUser.isAdmin);
}

有关详细信息,请参阅:info

关于angular - 错误 TS2345 Angular AngularFire2 检查用户是否为 Admin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47422348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com