2014-04-28 60 views
1

我正在使用BreezeJS和Angular從SAP Netweaver Gateway系統提供的Restful OData服務中使用數據。應用程序正在正確地從服務中讀取數據,包括元數據,並且如預期的那樣將這些全部保存在EntityManager中。BreezeJs,saveChanges() - 未捕獲TypeError:無法讀取未定義的屬性'statusText'

但是,當我更改其中一個實體的狀態並執行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;}); 
     } 
} 

凡經理是一個標準的微風的EntityManager。

代碼在服務器上被縮小,所以很難通過調試,但是這是在一個核心微風庫內引發的。

客戶端被執行$一批POST請求到服務器,服務器用202接受響應,如下

--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-- 

我希望這是一件somehere這裏之前已經見過!

+0

你在代碼中檢查statusText的值嗎? –

+0

你應該展示微風經理如何獲得實體,你如何改變他們 –

+0

嗨,感謝您的意見。由於我發佈了這個,我設法通過它調試我的方式,看起來問題是返回的數據與204無內容頭一起有「Content-Type:text/html」。 DataJS將其解釋爲具有數據,因爲它具有Content-Type,因此它會嘗試讀取數據並因此失敗,因爲它沒有text/html類型的處理程序,這會傳播回Breeze,而不是響應對象它期待它insead收到一個字符串「沒有處理這個數據」,它試圖檢查這個狀態文本並失敗。 – user3581810

回答

3

最終,這證明是處理OData的SAP Netweaver網關的一個怪癖。它不應該發送標題,並將「Content-ID」標題作爲內容標識發送。

要解決這些I最後不得不線datajs1.1.1從

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 }; 
} 

添加到readBatch方法

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 }; 
} 

和變更線15176 breeze.debug.js的

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

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

這解決了問題並確保響應正確處理。

相關問題