You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:01:36