2

最近、Parse PHP アプリケーションを Google Cloud でホストされている Parse Server に移行する作業を完了しました。それ以来、 、 などのバッチ アクションはParseObject::saveAll()ParseObject::destroyAll()ほとんどの場合に失敗し始めました。これを GitHub のバグとして報告することを考えていますが、これが私のインスタンスだけではないことを確認したいと思います。

destroyAllの GitHub PHP SDK テスト コードを再現することさえできません。

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

このコードと私のアプリケーションでバッチ アクションを使用すると、PHP で次の種類の例外がスローされます (この例では、saveAll によってエラーがスローされます)。

キャッチされない例外 'Parse\ParseException' とメッセージ 'cannot route batch path /1/classes/TestObject'

デバッグは、Parse Server がエラー コード 107を返すことを示しています。これは、ドキュメントによると無効な JSON を意味します。REST API には詳しくありませんが、この例では、送信されるデータは

{"requests":[{"method":"POST","path":"/1/classes/TestObject","body":[]},{"method":"POST","path":" /1/classes/TestObject","body":[]},{"method":"POST","path":"/1/classes/TestObject","body":[]}]}

これは有効な JSON です。

バッチ アクションは、移行前に正しく機能していました。PHP のバージョンは 5.6 です。どんな助けでも大歓迎です。エラーが再現できたら、GitHubにIssueを作成します。

4

2 に答える 2

6

/parse/classes/ClassName解決策は、代わりに書くことでし/1/classes/ClassNameた。したがって、移行後、https://parse.com/docs/rest/guideのドキュメントに記載されている詳細は古くなっています。

!!! これは将来変更される可能性があります!!! この問題に注目してください: https://github.com/ParsePlatform/parse-php-sdk/issues/229

于 2016-05-30T19:07:32.050 に答える
2

誰かがまだこれを探している場合に備えて、github から投稿されたソリューションを次に示します。

これをもう少し掘り下げました。サーバーは、バッチ リクエスト用に受信した URL に対して一部の削除を行っていることがわかりました。/parse具体的には、API プレフィックス (ほとんどの場合) が送信されたものと一致することを確認します。バッチ リクエストでは、個々のリクエストにこれが含まれていないため、最終的にこの一致に失敗します。上記のコードをテストして、パッチを当てることができました。うまくいきますが、将来、より良いパッチを作成できないかどうかを確認することになるでしょう。

現在、次のようにバッチ保存と削除の 2 つの場所で、API プレフィックスを/your_prefix/(これもほとんどの場合/parseですが、サーバー用に設定したものを使用してください) のように追加する必要があります。

ParseObject.php private static function deepSave($target, $useMasterKey = false)(/1/ が追加された場所と同じ場所)

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

ParseObject.phpprivate static function destroyBatch(array $objects, $useMasterKey = false)

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

これら 2 つの箇所を変更することで、バッチ保存と削除を適切に実行することができました。確認のために、以前と同じ問題も確認しました。

于 2016-06-17T18:18:09.477 に答える