【问题标题】:Set a state with user data getting getIdTokenResult ()设置用户数据获取 getIdTokenResult () 的状态
【发布时间】:2019-09-07 05:27:21
【问题描述】:

我在将对象放入并使其处于我的应用程序状态时遇到问题。

我需要使用从firebase.useruser.getIdTokenResult(true) 返回的数据挂载一个对象。

示例:

userLogged = {
  uid: user.uid, 
  displayName: user.displayName
  admin: false,
};

const token = await user.getIdTokenResult (true);
userLogged.admin = token.claims.admin;

逻辑与上面的类似,但是我只需要使用 Rxjs 运算符来执行此操作,以便我可以将这个对象隔离在我的应用程序的状态中。

@Effect

@Effect()
getUser$: Observable<Action> = this.actions$.pipe(
    ofType(auth.AuthActionTypes.GET_USER),
    switchMap(() => this.authService.getUser().pipe(
        map(user => {

            const userLogged = {
                uid: user.uid,
                displayName: user.displayName,
                admin: false,
            }

            // **** i need call user.getIdTokenResult() ******
            // and get claims.admin and assign to userLogged object admin.

            // authState = {
            //    uid: user.uid,
            //    displayName: user.displayName,
            //    admin: true, // true or false
            // }

            return new auth.Authenticated(userLogged);
        }),
        catchError((err => of(new auth.AuthError(err))))
    )

我仍在使用 Rxjs 使用响应式编程来调整自己,所以我很难合并封装的 Observables 数据。

【问题讨论】:

    标签: typescript rxjs firebase-authentication reactive-programming ngrx


    【解决方案1】:

    您可以使用.map() 在您的authService.getUser() 结果中“保留”user 对象的值。尽管很脏,但它仍然有效。

    @Effect()
    getUser$: Observable<Action> = this.actions$
        .pipe(
            ofType(auth.AuthActionTypes.GET_USER),
            switchMap(() => this.authService.getUser()),
            switchMap(user => user.getIdTokenResult().pipe(map(claims => ({claims, user}))), //map the user to "retain"
                switchMap(({claims, user}) => {
                    const userLogged = {
                        uid: user.uid,
                        displayName: user.displayName,
                        admin: claims.admin,
                    };
                    return new auth.Authenticated(userLogged);
                }),
                catchError(err => of(new auth.AuthError(err)))))
    

    如果您想重新训练更多值,建议您查看Subjects,以便它更清洁(以及正确的操作方式)。

    【讨论】:

    • 在最后一个 switchMap() 中我放了 map(),它对我有用,谢谢!
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多