2014-12-03 76 views
0

我試圖通過Datastore JS API發佈大量記錄(2000-ish)到Dropbox。我得到這個錯誤:Dropbox 400錯誤JavaScript數據存儲API請求

POST https://api12.dropbox.com/1/datastores/put_delta 400 (Bad Request)

...它引用:api12.dropbox.com/1/datastores/put_delta:1

這不是大量的信息,以調試時使用,但我想這是因爲我在大小限制。

任何想法如何解決這個問題或至少進一步調試?

更新

我使用Chrome的XHR檢查得到這樣的響應:

{"error": 
    { 
    "size_limit": "Error: put_delta of delta (size 4138335) exceeds size limit 2097152 bytes", 
    "object_type": "delta", 
    "limit": 2097152, 
    "size": 4138335 
} 
} 
+0

在響應的主體中是否有任何東西?我相信它應該包含更多關於錯誤的有用信息。 – Greg 2014-12-03 21:25:31

+0

我再次看了一遍,發現響應JSON(請參閱上文)。如果我不知道'POST'的大小會在我的應用程序中。有沒有辦法讓我把請求分解成大塊?有沒有像iOS SDK中那樣定期「同步」的方法來保持請求的大小? – 2014-12-03 23:31:35

回答

1

在JS SDK,有一個隱含的「同步」每一次你的代碼的產量控制回瀏覽器。所以如果你寫一個for循環輸入大量的數據,那麼這些都會進入單個增量。你可以用更小的塊來分解。例如,像這樣的東西(未經測試,遺憾,如果有一個錯誤或類似的錯誤):

var LIMIT = 100; // how many things to write in a single delta 

function writeThings(arrayOfThings) { 

    // write up to LIMIT things 
    for (var i = 0; i < arrayOfThings.length && i < LIMIT; i++) { 
     writeSingleThing(arrayOfThings[i]); 
    } 

    if (i < arrayOfThings.length) { 
     // more to write 

     window.setTimeout(function() { 
      // after a tick, continue from where we left off 
      writeThings(arrayOfThings.slice(i)); 
     }, 1); 
    } else { 
     // done writing 
    } 

} 
+0

這很有趣也很有幫助,謝謝。 「if/else」語句應該在'for'循環中,以便引用'i'? – 2014-12-05 17:19:04

+0

不,「if/else」是它應該是的位置。 '我'應該仍然在範圍內。爲什麼,你看到一個錯誤? – smarx 2014-12-05 17:22:55

+0

你說得對,它仍然在範圍內(JavaScript很奇怪)。 :)我發現我真正的問題。 'setTimeout'函數需要函數是第一個參數,而超時時間間隔是第二個參數。現在這對我很好。我可以上傳大數據集而不會達到增量限制。謝謝! – 2014-12-05 17:44:23