在Firestore集合上调用时,.doc()的预期参数错误

时间:2018-07-17 19:30:44

标签: firebase google-cloud-firestore angularfire2

每当有新用户登录时,我都想在Cloud Firestore数据库中创建一个新用户文档。每个文档都应具有唯一的ID,并且我希望每个用户都具有一个“ uid”属性,以匹配该用户自动生成的唯一ID。该文档。刚开始,我总是对用户进行更新,但是我认为分离创建和更新逻辑可能会有所帮助。如您所见,我还没有弄清楚如何查询用户是否存在,但是我认为我应该先测试createUser函数,然后再继续。

无论如何,当我测试我的createUser函数时,我遇到了编译错误。

  src / app / services / auth.service.ts(64,22)中的

ERROR:错误TS2554:   预期有1个参数,但有0个。

更新: 当我尝试在编译后从本地主机运行该函数时,在控制台中收到此错误。

  

Function CollectionReference.doc()要求其第一个参数为   类型为string,但是它是:undefined

这是我建议的解决方案:

import { Injectable } from '@angular/core';
import { User } from './../models/user.model';
import { PermissionsService } from './permissions.service';

import { auth } from 'firebase/app';
import { AngularFireAuth } from 'angularfire2/auth';
import {
    AngularFirestore,
    AngularFirestoreDocument,
    AngularFirestoreCollection,
} from 'angularfire2/firestore';

import { Observable, of } from 'rxjs';
import { switchMap } from 'rxjs/operators';

@Injectable({
    providedIn: 'root',
})
export class AuthService {
    usersCollection: AngularFirestoreCollection<User> = null;
    user: Observable<User>;

    constructor(
        private afAuth: AngularFireAuth,
        private db: AngularFirestore,
        private permissionsService: PermissionsService,
    ) {
        this.usersCollection = db.collection('users');
        this.user = this.afAuth.authState.pipe(
            switchMap((user) => {
                if (user) {
                    return this.db
                        .doc<User>(`users/${user.uid}`)
                        .valueChanges();
                } else {
                    return of(null);
                }
            }),
        );
    }

    loginGoogle() {
        const provider = new auth.GoogleAuthProvider();
        return this.oAuthLogin(provider);
    }

    loginFacebook() {
        const provider = new auth.FacebookAuthProvider();
        return this.oAuthLogin(provider);
    }

    loginTwitter() {
        const provider = new auth.TwitterAuthProvider();
        return this.oAuthLogin(provider);
    }

    oAuthLogin(provider) {
        return this.afAuth.auth.signInWithPopup(provider).then((credential) => {
            //if(the user exists already)
            //this.updateUserData(credential.user);
            //else
            this.createUser();
        });
    }

    createUser() {
        const newUserRef = this.usersCollection.doc<User>(); // Error here
        let newUser: User;
        this.user.subscribe((userData) => {
            newUser = {
                uid: newUserRef.id,
                email: userData.email,
                photoURL: userData.photoURL,
                displayName: userData.displayName,
                roles: {
                    member: true,
                },
                permissions: this.permissionsService.memberPermissions;
            };
        });

        newUserRef
            .set(newUser)
            .then(() => {
                console.log('created user');
            })
            .catch((err) => {
                console.log('Error adding user: ' + err);
            });
    }

    updateUserData(user) {
        const userRef: AngularFirestoreDocument<any> = this.db.doc(
            `users/${user.uid}`,
        );

        const userPermissions = this.addPermissions(userRef);
        console.log(userPermissions); // This works
        const data: User = {
            uid: user.uid,
            email: user.email,
            photoURL: user.photoURL,
            displayName: user.displayName,
            roles: {
                member: true,
            }, // I need to make sure this keeps current user roles
            permissions: userPermissions,
        };
        console.log(data); // This works

        userRef
            .set(data)
            .then(() => {
                console.log('Success: Data for userDoc overwritten');
            })
            .catch((err) => {
                console.error('Error writing to userDoc: ' + err);
            });
    }

    addPermissions(userRef) {
        const tempPermissions = [];
        userRef.valueChanges().subscribe((userdata) => {
            if (userdata.roles.reader === true) {
                tempPermissions.push(this.permissionsService.memberPermissions);
            }
            if (userdata.roles.author === true) {
                tempPermissions.push(this.permissionsService.authorPermissions);
            }
            if (userdata.roles.admin === true) {
                tempPermissions.push(this.permissionsService.adminPermissions);
            }
        });
        return tempPermissions;
    }

    checkPermissions(permission: string) {
        if (!this.user) {
            return false;
        } else {
            this.user.subscribe((data) => {
                for (const p of data.permissions) {
                    if (p === permission) {
                        return true;
                    }
                }
                return false;
            });
        }
    }

    logout() {
        this.afAuth.auth.signOut();
        this.user = null;
    }
}

我检查了.doc()函数上的documentation,它应该在0个参数的情况下正常工作。它应该返回一个空的文档引用。但是,它总是抛出错误,说它需要1个参数。知道为什么这行不通吗?

0 个答案:

没有答案