1

Angular で BreezeJS を使用して、SAP Netweaver Gateway System によって提供される Restful OData サービスからデータを使用しています。アプリケーションは現在、サービスからメタデータを含むデータを正しく読み取っており、これはすべて期待どおりに EntityManager に保持されています。

ただし、エンティティの 1 つのステータスを変更して saveChanges() を実行すると、成功コールバックも失敗コールバックも呼び出されず、代わりにコンソール エラーが表示されます。

Uncaught TypeError: Cannot read property 'statusText' of undefined 

保存を呼び出すコードは次のとおりです。

$scope.doSave = function(){
    $scope.purchases[0].Requester = "Dave" ;
        $scope.items[0].Description = "New Description";
        if (!$scope._isSaving)
        {
            console.log("Saving!");
            $scope._isSaving = true;
            manager.saveChanges().then(function(data){
                console.log("Saved");
                console.log(data);
                $scope._isSaving = false;
            }, function(error){
                console.log(error); 
                $scope._isSaving = false;});
        }
}

manager は標準の Breeze EntityManager です。

コードはサーバー上で縮小されているため、デバッグが非常に困難ですが、これはコアの Breeze ライブラリの 1 つにスローされています。

以下のように、クライアントはサーバーに対して $batch POST リクエストを実行し、サーバーは 202 Accepted で応答しています。

--0DD0586DB234C0A3D0D530A25CD1C8400
Content-Type: multipart/mixed; boundary=0DD0586DB234C0A3D0D530A25CD1C8401
Content-Length:       519

--0DD0586DB234C0A3D0D530A25CD1C8401
Content-Type: application/http
Content-Length: 111
content-transfer-encoding: binary

HTTP/1.1 204 No Content
Content-Type: text/html
Content-Length: 0
dataserviceversion: 2.0
content-id: 1


--0DD0586DB234C0A3D0D530A25CD1C8401
Content-Type: application/http
Content-Length: 111
content-transfer-encoding: binary

HTTP/1.1 204 No Content
Content-Type: text/html
Content-Length: 0
dataserviceversion: 2.0
content-id: 2


--0DD0586DB234C0A3D0D530A25CD1C8401--

--0DD0586DB234C0A3D0D530A25CD1C8400--

これがここのどこかで見たことのあるものであることを願っています!

4

1 に答える 1

3

結局、これは OData を処理する SAP Netweaver Gateway の癖であることが判明しました。送信すべきでないときにヘッダーを送信し、「Content-ID」ヘッダーを content-id として送信します。

これらを修正するために、datajs1.1.1 の readBatch メソッドに行を追加する必要がありました。

if (response.statusCode >= 200 && response.statusCode <= 299) {
     partHandler(context.handlerContext).read(response,   context.handlerContext);
} else {
     // Keep track of failed responses and continue processing the batch.
     response = { message: "HTTP request failed", response: response };
}

if (response.statusCode >= 200 && response.statusCode <= 299) {
    if (response.statusCode != 204) 
        partHandler(context.handlerContext).read(response,   context.handlerContext);
} else {
     // Keep track of failed responses and continue processing the batch.
     response = { message: "HTTP request failed", response: response };
}

そして、breeze.debug.js の 15176 行を次のように変更します。

var contentId = cr.headers["Content-ID"];

var contentId = cr.headers["content-id"];

これにより問題が解決され、応答が正しく処理されるようになりました。

于 2014-04-29T10:50:33.743 に答える