5

友人のクエリが失敗しました。幸いなことに、彼は失敗コールバックでそれをキャッチしていました (サーバー呼び出しごとに失敗コールバックがありますよね?)。彼が持っていたものは次のとおりです。

var getPersons = function(personsObservable) {
    return EntityQuery.from('Person')
           .using(マネージャー).execute()
           .then(querySucceeded).fail(queryFailed);
}
関数 queryFailed(エラー) {
    var msg = 'データの取得中にエラーが発生しました。' + error.message;
    logError(メッセージ、エラー);
    エラーをスローします。
}

単純に JSON データを示しましたerror.message... これは次のように見えます。

"[{"$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 であることを確認できました。これは、サーバーからすべてが正常であることを意味します。彼が実際のデータを持っていたという事実は、ほとんど同じことを言いました.

では、なぜ Breeze は失敗したのでしょうか。彼はどのように問題を診断しますか?

4

1 に答える 1

6

Breeze失敗している可能性があります。しかし、問題が別の場所にある可能性は十分にあります。通常、Breeze が失敗すると、意味のあるエラー メッセージが表示されます。このエラー メッセージは意味がありません。しかし、それは手がかりを提供します。

最初に成功のコールバックを確認してください

失敗コールバックは、(1)操作が失敗した場合、または (2)成功コールバックが失敗した場合に呼び出すことができます。操作が失敗した場合は、Breeze 関連の問題があります。成功のコールバックが失敗した場合は、アプリケーション コードに問題がある可能性があります。

どちらを決定するには、成功コールバックの最初の行 (彼の場合は の最初の行querySucceeded) にブレークポイントを置きます。ブレークポイントに到達すると、Breeze がその役割を果たし、ユーザーにハンドオフしたことがわかります。コールバックをステップ実行して、自分が犯した可能性が最も高く、修正が容易な間違いを見つけます。

カスタム EntityType コンストラクターと初期化子を確認してください

彼の場合、成功のコールバックに到達しませんでした。そのため、Breeze がサーバーからの JSON データからキャッシュされたエンティティを作成しようとしたときに、何か問題が発生しました。それは何でしょうか?

多くの潜在的な原因があります。Breeze のバグである可能性があります。ただし、最初にパイロットエラーを排除することが常に最善です。このためのカスタム コンストラクターまたは初期化子EntityTypeを作成しましたか?

彼がやった。fullName彼は、計算されたプロパティを自分の に追加する初期化子を持っていましたPerson。それは次のように見えました:

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

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

彼は問題を見ていませんでした。しかし、診断手順に従って、彼は初期化子にブレークポイントを設定しました

案の定...彼はタイプミスをしました...

// 「エンティティ」は存在しません。null オブジェクト エラー
return entity.firstName() + ' ' + person.lastName();

彼が に変わるとすぐentityperson、すべてがうまくいきました。

null オブジェクト参照が、メッセージ内failの JSONデータでQ promise エラーとして明らかになった理由を、現時点では説明できません。PersonJavaScript では奇妙なことが起こります。しかし、手がかりはそこにありました:

  • サーバーがデータを配信しました
  • 成功のコールバックに到達する前に失敗しました
  • データは約Person
  • Person初期化子 (またはコンストラクター)を持つ

手がかりを読むと、どこを見ればよいかがわかります。

このヒントが白髪と禿頭からあなたを救うことを願っています.

于 2013-02-08T20:22:52.573 に答える