2016-03-03 72 views
2

我最近完成了將我的Parse PHP應用程序遷移到Google Cloud託管的分析服務器的過程。此後,在大多數情況下,批量操作(如ParseObject::saveAll(),ParseObject::destroyAll()等)開始失敗。我正在考慮將此報告爲GitHub上的錯誤,但我想確保它不僅僅是我的實例。遷移後無法執行批處理操作

我甚至無法重現GitHub PHP SDK test code for destroyAll

... 
$o1 = ParseObject::create('TestObject'); 
$o2 = ParseObject::create('TestObject'); 
$o3 = ParseObject::create('TestObject'); 
ParseObject::saveAll([$o1, $o2, $o3]); 
ParseObject::destroyAll([$o1, $o2, $o3]); 
... 

無論這個代碼和批處理操作的我的應用程序的使用會引發以下的PHP類型的異常(在本例中,錯誤是由白水拋出) :

未捕獲的異常 '解析\ ParseException的' 與消息 '不能路由批次路徑/ 1 /類/的TestObject'

調試顯示分析服務器返回錯誤代碼107根據the documentation表示無效的JSON。我不熟悉REST API,但是對於此示例,發送的數據是

{「requests」:[{「method」:「POST」,「path」:「/ 1/classes /的TestObject」, 「體」:[]},{ 「方法」: 「POST」, 「路徑」: 「/ 1 /類/的TestObject」, 「體」:[]},{ 「方法」: 「POST」, 「path」:「/ 1/classes/TestObject」,「body」:[]}]}

哪個是有效的JSON。

批處理操作在遷移前正常工作。 PHP版本是5.6。任何幫助表示讚賞。如果錯誤可以複製,我會在GitHub上創建一個問題。

+0

嘗試刪除「/ 1」 – xissburg

+0

@xissburg感謝您的回覆,但這沒有什麼區別。我刪除了「/ 1」和「/ 1 /」,錯誤是一樣的。我很難理解可能導致錯誤的原因。 – lipusal

回答

6

解決的辦法是編寫/parse/classes/ClassName而不是/1/classes/ClassName。所以在遷移之後,文檔https://parse.com/docs/rest/guide中陳述的細節已經過時。

!!!這可能會在未來發生變化!請關注這個問題:https://github.com/ParsePlatform/parse-php-sdk/issues/229

+0

如果你是給我寫信而不是普通讀者,我自己就開啓了這個問題,並且通過那裏得到了答案。儘管我沒有在一段時間內檢查過問題頁面,但看起來其他人正在使用相同的解決方案。感謝您的提醒,以前應該自己回答。 – lipusal

2

爲防萬一還在尋找這個,下面是從github上發佈的解決方案。

我深入瞭解了這一點。事實證明,服務器會在它收到的批量請求的url上進行一些清除操作。具體來說,它會檢查您的api前綴(大多數情況下爲/parse)與發送的內容匹配。對於批量請求,各個請求不包含此內容,並且最終未能匹配。測試你上面提出的代碼,我能夠修補它。它的工作原理,但我可能會看到,如果我將來不能寫出更好的補丁。

您目前需要在兩個地方預先配置您的api前綴/your_prefix/(大多數情況下這是/parse,但使用您爲服務器設置的那個),以進行批處理保存和刪除操作,如下所示。

private static function deepSave($target, $useMasterKey = false) ParseObject.php(其中被前置/ 1 /同一地點)

foreach ($requests as &$r) { 
    $r['path'] = '/parse/' . $r['path']; 
} 

的parseObject。PHP private static function destroyBatch(array $objects, $useMasterKey = false)

foreach ($objects as $object) { 
    $data[] = [ 
     'method' => 'DELETE', 
     'path' => '/parse/classes/'.$object->getClassName().'/'.$object->getObjectId(), 
    ]; 
} 

有了這兩個基本點改變了我能得到批量保存&刪除已正常運行。我也觀察過你以前的相同問題,只是爲了證實。