Не удается выполнить пакетные операции после миграции

Я недавно завершил миграцию моего приложения Parse PHP на сервер Parse, размещенный в Google Cloud. С тех пор пакетные действия, такие как ParseObject::saveAll(), ParseObject::destroyAll()и т.д. начали выходить из строя в большинстве случаев. Я думаю об этом как об ошибке на GitHub, но хочу убедиться, что это не только мой экземпляр.

Я даже не могу воспроизвести Тестовый код GitHub PHP SDK для destroyAll:

...
$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’ с сообщением ‘не может маршрутизировать пакетный путь / 1 / classes / TestObject’

Отладка показывает, что Parse Server возвращает код ошибки 107 который согласно документация означает неверный JSON. Я не знаком с REST API, но для этого примера отправленные данные

{ «просьбы»: [{ «метод»: «POST», «путь»: «/ 1 / классы / TestObject», «тело»: []}, { «метод»: «POST», «путь»:» / 1 / классы / TestObject», «тело»: []}, { «метод»: «POST», «путь»: «/ 1 / классы / TestObject», «тело»: []}]}

Что является действительным JSON.

Пакетные действия работали правильно перед миграцией. Версия PHP 5.6. Любая помощь приветствуется. Если ошибка может быть воспроизведена, я создам проблему на GitHub.

2

Решение

Решение было написать /parse/classes/ClassName вместо /1/classes/ClassName, Таким образом, после миграции, детали, указанные в документации на https://parse.com/docs/rest/guide, устарели.

!!! это может измениться в будущем !!! следить за этой проблемой: https://github.com/ParsePlatform/parse-php-sdk/issues/229

6

Другие решения

На всякий случай, если кто-то все еще ищет это, вот решение, размещенное на github.

Я копался в этом немного больше. Оказывается, сервер выполняет некоторые операции с URL-адресами, которые он получает для пакетных запросов. В частности, он проверяет, что ваш префикс API (/parse в большинстве случаев) соответствует тому, что было отправлено. С пакетными запросами отдельные запросы не содержат этого, и они заканчиваются тем, что провалили это соответствие. Тестируя код, который вы выложили выше, я смог его исправить. Это работает, но я, вероятно, посмотрю, смогу ли я написать лучший патч в будущем.

В настоящее время вам нужно добавить префикс api как /your_prefix/ (опять же в большинстве случаев это /parse, но используйте тот, который вы настроили для своего сервера) в двух местах для пакетного сохранения и удаления, как показано ниже.

ParseObject.php private static function deepSave($target, $useMasterKey = false) (то же самое место, где добавляется / 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(),
];
}

После того, как эти два пятна изменились, я смог получить пакетные сейвы & удаляет работает правильно. Я также заметил ту же проблему, что и раньше, только для подтверждения.

2

По вопросам рекламы [email protected]