【问题标题】:How to handle error/event when the Ember-Data Store do not find any record?Ember-Data Store 找不到任何记录时如何处理错误/事件?
【发布时间】:2015-01-06 06:30:05
【问题描述】:

情况是:

  • session.userID 有一个正确的 ID
  • 但是,后端数据库 (Firebase) 中没有用户数据

代码如下:

App.ApplicationRoute = Ember.Route.extend({
  model: function() {
    if (this.session.userID) {
      return this.store.find('user', this.session.userID).then(function(_user) {
        console.log('user found', _user);
        return _user;
      }, function(error) {
        // user does not exist or some other error
        console.log('Application Model did not find user in Firebase');
        return null;
      });
    } else {
      console.log('Application Model did not find any session.userID');
      return null;
    }
  },

}); 

我的期望: Promise 应该调用错误函数:

function(error) {
  // user does not exist or some other error
  console.log('Application Model did not find user in Firebase');     
});

错误:但是,我收到以下错误:

    Error: no record was found at https://dynamicslife.firebaseio.com/users/facebook%3A931321683548734
        at https://cdn.firebase.com/libs/emberfire/1.2.7/emberfire.min.js:10:3400
        at c (https://cdn.firebase.com/js/client/1.1.2/firebase.js:17:65)
        at https://cdn.firebase.com/js/client/1.1.2/firebase.js:123:689
        at uc (https://cdn.firebase.com/js/client/1.1.2/firebase.js:50:20)
        at Xe (https://cdn.firebase.com/js/client/1.1.2/firebase.js:123:675)
        at Ve.Vb (https://cdn.firebase.com/js/client/1.1.2/firebase.js:123:617)
        at Ye.Vb (https://cdn.firebase.com/js/client/1.1.2/firebase.js:124:418)
        at https://cdn.firebase.com/js/client/1.1.2/firebase.js:139:409
        at https://cdn.firebase.com/js/client/1.1.2/firebase.js:68:878
        at pc (https://cdn.firebase.com/js/client/1.1.2/firebase.js:62:618) ember.js:14876
    Uncaught Error: Assertion Failed: Error: no record was found at https://dynamicslife.firebaseio.com/users/facebook%3A931321683548734 

问题:我知道没有记录可查。但是如何处理这种情况并避免抛出错误呢?我的印象是,Promise 可以让我在系统崩溃之前管理错误。

【问题讨论】:

  • 服务器的响应是什么样的,http 代码是什么?
  • Kingpin2k,我很高兴您对帮助 Ember 社区的奉献精神。非常感谢!我编辑了我的问题以提供有关错误的更多详细信息。
  • 看到这个,我很想说这是 emberfire 实现中的错误。处理承诺时,您需要调用 resolve 或 reject 回调。他们可能未能实现对某些错误调用拒绝回调。所以这个承诺陷入了困境,永远不会被正确地拒绝。
  • 看实现,应该是调用reject路径,但是你说的不是console.log('Application Model did not find user in Firebase');,对吧?
  • 你是对的,应用程序没有命中console.log('Application Model did not find user in Firebase');,也没有命中console.log('user found', _user);。根据您的评论,我想知道是否可以将 this.store.find('user', this.session.userID) 包装到 RSVP.Promise 中以处理错误。您在此处提供了一个示例:stackoverflow.com/questions/20810162/…

标签: ember.js ember-data


【解决方案1】:
App.ApplicationRoute = Ember.Route.extend({
  model: function() {
    if (this.session.userID) {
      return this.store.find('user', this.session.userID);
    } else {
      console.log('Application Model did not find any session.userID');
      return null;
    }
  },
  afterModel: function(user, transition) {
    if (user.get('length') === 0) {
      console.log('fail');
    } else {
      console.log('success');
    }
  }
});

http://emberjs.com/api/classes/Ember.Route.html#method_afterModel

【讨论】:

  • EmberFire 适配器似乎无法正确处理 find() 方法。我的应用程序在模型上崩溃并且没有运行 afterModel。
  • 您确定 this.session.userId 有效吗?
  • 是的。我可以在 Chrome Dev 中看到它。具有正确用户 ID 的工具。
  • 问题不在这里。正如您在文档中看到的那样,这种方法是完全正确的,甚至是推荐的。
  • 我同意。目前,我已经能够使用 findById 作为解决方法。一旦找到问题所在,我将更新此问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多