查询失败,error.message是数据

时间:2013-02-08 20:22:53

标签: breeze

朋友的查询失败了。幸运的是,他在失败的回调中捕获了它(你为每个服务器调用都有一个失败的回调,对吧?)。这就是他的所作所为:

var getPersons = function(personsObservable) {
    return EntityQuery.from('Person')
           .using(manager).execute()
           .then(querySucceeded).fail(queryFailed);
}
function queryFailed(error) {
    var msg = 'Error retreiving data. ' + error.message;
    logError(msg, error);
    throw error;
}

error.message只显示了JSON数据......看起来有点像这样:

"[{"$id":"1","$type":"Person, ProjectName","Id":12,"FirstName":"Bob","LastName":"Smith","Email":"bs@contoso.com","Blog":"http://bs.contoso.com","Twitter": ..." 

WAT吗 他检查了error.XHR,它提供了用于此查询的完整AJAX XHR对象。他可以看到HTTP状态代码是200 ...这意味着服务器上的一切都很酷。他有真实数据的事实几乎说了同样的事情。

为什么Breeze失败了?他如何诊断问题?

1 个答案:

答案 0 :(得分:6)

Breeze 可能失败。但这个问题很有可能存在于其他地方。通常,如果Breeze失败,则会显示有意义的错误消息。此错误消息没有意义。但它确实提供了线索。

首先检查您的成功回调

如果操作失败,则可以调用失败回调(1);如果成功回调失败,则调用(2)失败回调。如果操作失败,则会遇到与Breeze相关的问题。如果成功回调失败,则可能存在应用程序代码问题。

要确定哪一个,在成功回调的第一行(在他的情况下,querySucceeded的第一行)放置一个断点。如果你点击了断点,你知道Breeze已经做到了这一点,并已交给你了。逐步完成回调,找出最有可能发生错误的错误,因此很容易解决。

检查自定义EntityType构造函数和初始值设定项

在他的情况下,它没有得到成功的回调。因为Breeze试图从服务器中获取JSON数据中的缓存实体,所以出了点问题。那可能是什么?

有许多潜在的原因。可能是一个微风的bug。但总是最好先消除飞行员错误。您是否为此EntityType撰写了custom constructor or initializer

他做到了。他有一个初始化程序,为fullName添加了Person计算属性。看起来有点像这样:

metadataStore.registerEntityTypeCtor('Person', null, personInitializer);

function personInitializer(person) {
    person.fullName = ko.computed(function () {
        return entity.firstName() + ' ' + person.lastName();
    });
}

他没有看到问题。但是按照诊断程序,他在初始化程序上设置了断点

果然......他有一个错字......

// "entity" does not exist. Null object error
return entity.firstName() + ' ' + person.lastName();

一旦他将entity更改为person,一切都很顺利。

我现在无法解释为什么空对象引用在消息中与JSON fail数据一起表现为Q promise Person错误。奇怪的东西发生在JavaScript中。但线索在那里:

  • 服务器提供了数据
  • 在获得成功回调之前失败
  • 数据大约是Person
  • 拥有Person初始值设定项(或构造函数)

阅读线索,你会知道在哪里看。

希望这个小贴士可以让你远离白发和秃头。