AngularFire2关联Firebase用户与数据库记录报错求助
解决AngularFire2 + Ionic中“cannot set property 'userid' of undefined”的问题
嘿,我来帮你搞定这个报错!你遇到的这个错误,核心原因就是你尝试给一个未初始化的Item对象设置userId属性——简单说就是这个对象还不存在,你就想给它塞值,自然会报错啦。
先看你的代码,你定义了Item类,但大概率是在使用的时候没正确创建实例。下面是具体的修复步骤:
1. 完善Item类的定义
首先把你的Item类补全,明确每个属性的类型,避免模糊定义带来的问题:
export class Item { merknya: string; type: string; year: string; place: string; userId: string; // 明确类型为string,和Firebase里的uid类型匹配 }
2. 确保正确实例化Item对象
在你要创建并保存Item的地方,一定要先通过new Item()创建一个实例,再给它的属性赋值。不要直接声明一个变量就去赋值,那样变量默认是undefined。
结合AngularFireAuth获取用户UID的完整代码示例如下:
import { Component } from '@angular/core'; import { AngularFireAuth } from 'angularfire2/auth'; import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database'; import { Item } from './item.model'; // 假设你的Item类在这个路径 @Component({ selector: 'app-item-form', templateUrl: './item-form.component.html' }) export class ItemFormComponent { items: FirebaseListObservable<Item[]>; constructor(private afAuth: AngularFireAuth, private db: AngularFireDatabase) { // 初始化数据库引用 this.items = db.list('/items'); } // 假设这是你添加Item的方法 addNewItem(merknya: string, type: string, year: string, place: string) { // 先订阅用户认证状态,确保获取到登录用户的uid this.afAuth.authState.subscribe(user => { if (user) { // 关键步骤:先创建Item实例! const newItem = new Item(); // 给实例的属性赋值 newItem.merknya = merknya; newItem.type = type; newItem.year = year; newItem.place = place; newItem.userId = user.uid; // 现在对象已初始化,不会报错了 // 将Item推送到Firebase数据库 this.items.push(newItem); } else { console.error('请先登录,才能添加Item!'); } }); } }
关键注意点
- 不要跳过实例化步骤:永远不要直接用
let item;然后item.userId = ...,必须用new Item()创建对象后再赋值。 - 处理异步的用户状态:
authState是异步的,一定要在订阅回调里处理用户UID,确保用户已经登录,避免user为null的情况。 - 属性类型匹配:Firebase里的用户
uid是字符串类型,所以Item类的userId也要定义为string,避免类型不兼容的问题。
这样修改后,你应该就能顺利创建带有userId的Item并保存到Firebase数据库里了!
内容的提问来源于stack exchange,提问作者Fajar Kidut
相关产品推荐
相关产品推荐

