如何使用Emberfire推送或更新数据?遇断言失败问题求助
解决Emberfire推送/更新用户数据的报错问题
我明白你现在遇到的困扰:登录后想把Firebase返回的用户数据推送到Ember的store中,明明已经在app/models目录下创建了user.js模型文件,但调用store.push时却收到Assertion failed, you need to pass a model ...的错误提示。下面我来帮你梳理具体的解决方案:
首先,先确认你的user模型定义是否规范,这是数据操作的基础:
// app/models/user.js import Model, { attr } from '@ember-data/model'; export default class UserModel extends Model { @attr('string') displayName; @attr('string') email; @attr('string') photoURL; @attr('string') firebaseUID; @attr('string') rank; // 把你需要用到的其他属性都用@attr装饰器声明出来 }
接下来针对推送数据到本地store和更新数据同步到Firebase两种场景,分别给出正确的写法:
一、推送新用户数据到本地Store(仅存前端,不同步Firebase)
如果你只是想把登录返回的用户数据加载到Ember本地store中,推荐用更简洁的pushRecord方法,不容易出错:
// 你的路由登录函数片段 let userInfo = { id: data.currentUser.uid, displayName: data.currentUser.displayName, email: data.currentUser.email, photoURL: data.currentUser.photoURL, firebaseUID: data.currentUser.uid, rank: "scorer" // 补充完整你的其他属性 }; // 推送数据到store let userRecord = self.store.pushRecord('user', userInfo);
如果坚持要用store.push,请严格遵循JSON API规范,确保格式完全正确:
self.store.push({ data: { id: data.currentUser.uid, type: 'user', // 这里必须和模型名称一致(单数形式) attributes: { displayName: data.currentUser.displayName, email: data.currentUser.email, photoURL: data.currentUser.photoURL, firebaseUID: data.currentUser.uid, rank: "scorer" // 所有属性都要放在attributes对象里,不能遗漏或拼写错误 } } });
二、更新用户数据并同步到Firebase
如果需要修改用户数据并同步回Firebase,步骤是先从store找到对应记录,修改属性后保存:
self.store.findRecord('user', data.currentUser.uid).then((user) => { // 更新属性 user.set('displayName', data.currentUser.displayName); user.set('email', data.currentUser.email); // 其他需要更新的属性 // 保存到Firebase return user.save(); }).catch((error) => { console.error('更新用户数据失败:', error); });
最后检查几个容易踩坑的点:
- 模型文件名必须是
user.js,类名是UserModel,确保Ember能正确识别模型 - 确认Emberfire和Ember Data的版本兼容,比如Ember Data 4.x需要搭配对应的Emberfire版本
- 适配器配置正确,
app/adapters/application.js要使用Firebase适配器:
import FirebaseAdapter from 'emberfire/adapters/firebase'; export default class ApplicationAdapter extends FirebaseAdapter {}
内容的提问来源于stack exchange,提问作者Killbutra
相关产品推荐
相关产品推荐

