5

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

var getPersons = 函数(personsObservable){
    return EntityQuery.from('Person')
           .using(manager).execute()
           .then(querySucceeded).fail(queryFailed);
}
函数查询失败(错误){
    var msg = '获取数据时出错。' + 错误消息;
    日志错误(消息,错误);
    抛出错误;
}

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

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

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

那么微风为什么会失败呢?他如何诊断问题?

4

1 回答 1

6

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

首先检查您的成功回调

可以调用失败回调 (1) 如果操作失败或 (2) 如果成功回调失败。如果操作失败,您将遇到与 Breeze 相关的问题。如果成功回调失败,您可能遇到了应用程序代码问题。

要确定哪个,在成功回调的第一行放置一个断点(在他的例子中,第一行querySucceeded)。如果你到达断点,你就知道 Breeze 已经完成了它的工作并且已经交给你了。逐步检查您的回调,找出最有可能是您的错误,因此很容易修复。

检查您的自定义 EntityType 构造函数和初始化程序

在他的情况下,它没有到达成功回调。所以当 Breeze 试图从服务器的 JSON 数据中创建缓存的实体时出现了问题。那会是什么?

有很多潜在的原因。可能是微风错误。但是,始终最好首先消除飞行员的错误。您是否为此编写了自定义构造函数或初始化EntityType程序?

他做到了。他有一个初始化器,可以将fullName计算属性添加到他的Person. 它看起来像这样:

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

函数personInitializer(人){
    person.fullName = ko.computed(function () {
        返回 entity.firstName() + ' ' + person.lastName();
    });
}

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

果然……他打错字了……

// “实体”不存在。空对象错误
返回 entity.firstName() + ' ' + person.lastName();

他一改成entityperson一切都好。

我目前无法解释为什么 null 对象引用在消息中fail的 JSONPerson数据中表现为 Q 承诺错误。奇怪的事情发生在 JavaScript 中。但线索在那里:

  • 服务器传递数据
  • 在到达成功回调之前失败
  • 数据是关于Person
  • 有一个Person初始化器(或构造器)

阅读线索,你就会知道去哪里找。

希望这个提示可以使您免于白发和秃头。

于 2013-02-08T20:22:52.573 回答