BreezeJs,saveChanges() - 未捕获的TypeError:无法读取未定义的属性'statusText'

时间:2014-04-28 14:55:46

标签: javascript angularjs odata breeze sap

我使用BreezeJS和Angular来使用SAP Netweaver网关系统提供的Restful OData服务中的数据。应用程序当前正在从服务中正确读取数据,包括元数据,并且所有这些都按预期保存在EntityManager中。

但是,当我更改其中一个实体的状态并执行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;});
        }
}

经理是标准的Breeze EntityManager。

代码在服务器上缩小,因此很难通过调试,但这是在一个核心的breeze库中抛出。

客户端正在向服务器执行$ 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--

我希望这是以前在这里见过的东西!

1 个答案:

答案 0 :(得分: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"];

这解决了问题并确保正确处理了响应。