- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 firebase 中设置自定义用户数据库,其中将使用用户身份验证 uid 存储文档 ID。
我目前面临的问题是存储当前用户文档,以便在用户登录时显示在我的仪表板上。
目前,在我的 authService.ts 上,我存储来自 firebase.user 的数据在我的仪表板上将仅显示默认数组中的信息。这就是我的 auth.service.ts
export class AuthService {
userData: any;
userCollection: AngularFirestoreCollection<User>;
constructor(
public afs: AngularFirestore, // Inject Firestore service
public afAuth: AngularFireAuth, // Inject Firebase auth service
public router: Router,
public ngZone: NgZone, // NgZone service to remove outside scope warning
) {
/* Saving user data in localstorage when
logged in and setting up null when logged out */
this.afAuth.authState.subscribe(user => {
if (user) {
this.userData = user;
localStorage.setItem('user', JSON.stringify(this.userData));
JSON.parse(localStorage.getItem('user'));
this.UserID = this.userData.uid;
} else {
localStorage.setItem('user', null);
JSON.parse(localStorage.getItem('user'));
}
})
}
SignUp(username, email, password) {
return this.afAuth.auth.createUserWithEmailAndPassword(email, password)
.then((result) => {
// set account doc
let created_data = JSON.parse(JSON.stringify(result.user));
const account = {
uid: result.user.uid,
created_time: created_data.createdAt,
email: result.user.email,
display_name: username,
photoURL: result.user.photoURL,
}
this.SetUserData(account);
}).catch((error) => {
window.alert(error.message)
})
}
/* Setting up user data when sign in with username/password,
sign up with username/password and sign in with social auth
provider in Firestore database using AngularFirestore + AngularFirestoreDocument service */
SetUserData(user) {
const userRef: AngularFirestoreDocument<User> = this.afs.doc(`users/${user.uid}`);
const userData: User = {
bio: null,
country: {
country: null,
country_code:null,
symbol:null
},
gender: "unspecified",
languages: null,
profile_pic: user.photoURL,
username: user.display_name,
}
return userRef.set(userData, {
merge: true
})
}
}
以及我的dashboard.component.ts
export class DashboardComponent implements OnInit {
isLoggedIn$: Observable<boolean>;
isLoggedOut$:Observable<boolean>;
constructor(
public afAuth: AngularFireAuth,
public authService: AuthService
) { }
ngOnInit() {
this.isLoggedIn$ = this.afAuth.authState.pipe(map(user => !!user));
this.isLoggedOut$ = this.isLoggedIn$.pipe(map(loggedIn => !loggedIn));
}
}
这样,我只能从 firebase.user 中存储的内容获取详细信息,而不能从我的自定义数据库中获取详细信息。如何根据经过身份验证的用户的 UID 进入特定文档,以便显示个人简介、性别和语言等信息?
这就是我在 dashboard.html
上解析信息的方式
<!-- Main content -->
<main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4">
<div class="inner-adjust">
<div class="pt-3 pb-2 mb-3 border-bottom">
<h1 class="h2">User Profile</h1>
</div>
<!-- Show user data when logged in -->
<div class="row" *ngIf="authService.userData as user">
<div class="col-md-12">
<div class="media">
<img class="align-self-start mr-5 img-thumbnail rounded-circle" src="{{(user.photoURL) ? user.photoURL : '/assets/placeholder-user.jpg'}}"
alt="{{user.displayName}}">
<div class="media-body">
<h1>Hello: <strong>{{(user.username)}}</strong></h1>
<p>Email: <strong>{{user.email}}</strong></p>
<p>Gender: <strong>{{user.gender}}</strong></p>
<p>Languages: <strong>{{user.languages}}</strong></p>
</div>
</div>
</div>
<!-- </div> -->
</div>
</div>
</main>
最佳答案
我认为没有必要使用 localStorage
,只要应用程序正在运行,Firebase 就会发出 authstate,并且如果用户没有登录,authState
返回null
。
顺便说一句 - 您还在一个地方使用 JSON.parse(JSON.stringify(...))
,这没有什么意义;)
无论如何,我有类似的设置,这就是我的做法:
在身份验证服务中:
user$ = this.afAuth.authState.pipe(
switchMap(user => {
if (user) {
return this.afs.doc<any>(`users/${user.uid}`).valueChanges();
} else {
return of(null);
}
})
);
然后我就订阅我需要的user$
。通过手动订阅或使用异步管道来完成此操作。如果您想手动订阅,您需要记住在组件销毁时取消订阅。
这里使用异步管道的示例:
user$ = this.authService.user$;
constructor(private authService: AuthService) { }
模板:
<div *ngIf="(user$ | async) as user">
<h1>Hello: <strong>{{ user.username }}</strong></h1>
</div>
另外,不要使用任何
。请为您的数据创建模型(界面是我的偏好)。毕竟我们正在使用 TypeScript ;)
关于AngularFire根据用户身份验证检索文档ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58060028/
$destroy() 存在于 Angularfire 中的原因是什么? angularfire 的文档说: https://www.firebase.com/docs/web/libraries/an
我收到“错误:permission_denied:客户端无权访问所需数据。”我比较确定我有规则问题。有没有办法跟踪 angularfire 中哪些客户端调用失败?该库中的抽象级别和异步性使得甚至很难找
我看过有关如何检查特定文档是否存在的示例。但是,是否可以在执行如下查询时检查文档是否存在? private albumsCollection: AngularFirestoreCollection;
我正在寻找一种方法来获取子元素的方法,而不是单独加载该元素。 假设我有一个 Post 模型,每个帖子都有评论。这就是我获得帖子模型的方式: var post = $firebase(new Fireb
这是我认为的相关代码: p(ng-repeat="t in todos") input( type="checkbox", ng-model="t.done", ng-clic
好的,我刚开始使用 Firebase。我读过这个:https://www.firebase.com/docs/data-structure.html我读过这个:https://www.firebase
如何更新节点内的单个对象。 { foo: { title: 'hello world', time: '1000' } } 如上所述,我只想更新标题。$firebase(new
我正在使用 AngularFire并在我的 app.module.ts 中启用离线支持的持久性: imports: [ AngularFireModule.initializeApp(envir
我无法增加帖子“点赞”的数量。以下是我现在拥有的: addLike(pid, uid) { const data = { uid: uid, }; this.afs
我正在使用 AngularFire 创建一个新用户。但是,当我注册用户时,我还会询问名字和姓氏,并在注册后添加该信息。 $firebaseSimpleLogin(fbRef).$createUser(
我已经在 DIV 中发布了有关我的背景图像的先例问题。它在当前日期成功运行。但是,当我想使用用户在数据库中输入的时间和模型“starthourid”来调整背景图像时,它不起作用(它显示“夜晚”)!但数
在努力完成Angular tutorials on their website时当我尝试创建一个使用 Firebase 的列表时,我陷入了困境。来存储数据。奇怪的是,Angular 网站上一切正常,但
我正在努力使用 AngularFire 进行用户身份验证和授权。 问题是,一旦授权用户登录并显示来自 Firebase 的数据,如果我注销,则数据仍然会显示。我可以将数据从范围中分离出来(delete
我正在使用 AngularFire 和 Angular 8 来构建一个应用程序,但我有一个愚蠢的问题(我相信它实际上很愚蠢)。 我构建了一个简单的服务来包装 AngularFireAuth : imp
我正在使用 Angularfire 制作网站。我正在尝试将基于 oauth 的登录与 google 集成以进行用户身份验证,但是当我尝试运行 index.html 文件并尝试登录时显示错误 11:59
我想让我的 angularFire 集合在路由加载时解析。像这样的东西: App.config ($routeProvider, angularFireProvider) -> $routePro
我正在尝试获取简单 angularFireCollection 数组的长度,但似乎无法: var stf = new FireBase("http://myfirebase-app.firebasei
我有一个带有用户存储的 FireBase 数据库。我也使用简单的登录电子邮件/密码。在用户存储中,我保存了一些用户的额外信息——例如最后登录日期。这是我的工作流程 - 从注册到登录: 我注册了一个用户
我在 /items 中有 Firebase 条目,其属性为 title 和 points。在输入新项目之前,我试图检查是否存在具有相同 title 的项目。 这是我所拥有的,但它并没有发生: app.
我将数据按以下结构存储在 firebase 中(图 1)。我遵循了结构化数据的指南,并将其保存在一个平面结构中,其中包含事件和用户的键值对,以允许多对多关系引用。我想使用 userid 来查找用户有权
我是一名优秀的程序员,十分优秀!