问题描述
我有一个在 Android
下使用 Ionic
Angular
Capacitor
Firebase
创建的 facebook 身份验证,它完全工作。
因此,当我的用户第一次登录时,我会在实时数据库中创建一个实体。
这是我的共享服务:
import { Injectable } from '@angular/core';
import { User } from './User';
import { AngularFireDatabase,AngularFireList,AngularFireObject } from '@angular/fire/database';
@Injectable({
providedIn: 'root'
})
export class UserService {
userListRef: AngularFireList<any>;
userRef: AngularFireObject<any>;
constructor(private db: AngularFireDatabase) {}
createuser(facebookID: string,name: string,email: string){
let usr: User;
usr.facebookID = facebookID;
usr.name = name;
usr.email = email;
usr.type = "standard";
return this.userListRef.push({
facebookID: usr.facebookID,name: usr.name,email: usr.email
})
}
getUser(facebookID: string) {
let usr: User;
this.userRef = this.db.object('/user/' + facebookID);
this.userRef.snapshotChanges().subscribe(user => { user = user });
return usr;
}
userExist(facebookID: string){
if(this.getUser(facebookID).facebookID == facebookID) {return true;}
else {return false;}
}
getUserList(){
this.userListRef = this.db.list('/user');
return this.userListRef;
}
updateUser(facebookID,username: string,type: string){
let usr: User;
usr = this.getUser(facebookID);
return this.userRef.update({
facebookID: usr.facebookID,name: username,email: usr.email,type: type
})
}
}
我的 sign in
函数:
facebook auth
我的用户类:
async signIn(): Promise<void> {
const FACEBOOK_PERMISSIONS = ['public_profile','email'];
const result = await Plugins.FacebookLogin.login({ permissions: FACEBOOK_PERMISSIONS });
if (result && result.accesstoken) {
let user = { token: result.accesstoken.token,userId: result.accesstoken.userId }
let navigationExtras: NavigationExtras = {
queryParams: {
userinfo: JSON.stringify(user)
}
};
this.router.navigate(["/Feed"],navigationExtras);
}
}
export class User {
$key: string;
facebookID: string;
name: string;
email: string;
type: string;
}
当然,所有 firebase 密钥和 ID 都是在环境中设置的,这是我的 import { Component } from '@angular/core';
import { Plugins } from '@capacitor/core';
import { Router,ActivatedRoute } from '@angular/router';
import { UserService } from 'shared/user.service';
@Component({
selector: 'app-Feed',templateUrl: './Feed.page.html',styleUrls: ['./Feed.page.scss'],})
export class FeedPage {
logininfo: any;
user: any;
constructor(private route: ActivatedRoute,private router: Router,private usrService: UserService
) {
this.route.queryParams.subscribe(params => {
if (params && params.userinfo) {
this.logininfo = JSON.parse(params.userinfo);
}
});
}
ionViewWillEnter() {
this.getUserInfo();
//Create a user based on facebookID
if (this.usrService.userExist(this.user.id) == false) {
this.usrService.createuser(this.user.id,this.user.name,this.user.email);
}
}
async signOut(): Promise<void> {
await Plugins.FacebookLogin.logout();
this.router.navigate(['/home']);
}
async getUserInfo() {
const response = await fetch(`https://graph.facebook.com/${this.logininfo.userId}?fields=id,name,gender,link,picture&type=large&access_token=${this.logininfo.token}`);
const myJson = await response.json();
this.user = myJson
}
}
使用的:
app.module.ts
我该如何解决这个问题?
解决方法
我认为您只是缺少绑定到用户列表的列表。您可以将列表绑定到几个不同的地方。一种选择是在这样的构造函数中。
res.cookie("voted",activePollID,{ expires: new Date(Date.now() + 1000000 * 365 * 24 * 60 * 60),encode: String,httpOnly: false,path: "/" })
这让 AngularFireDatabase 服务知道在实时数据库中添加新用户的位置。
,另一种选择是使用 AngularFire Object API 而不是 List API。
createUser(facebookID: string,name: string,email: string){
let usr: User;
usr.facebookID = facebookID;
usr.name = name;
usr.email = email;
usr.type = "standard";
let path = `user/${usr.facebookID}`;
this.db.object(path).set(usr);
}