迁移后无法执行批量操作

Can't perform batch operations after migration

我最近完成了将我的 Parse PHP 应用程序迁移到 Google 云托管的 Parse Server。从那时起,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 上抛出以下类型的异常(在此示例中,错误由 saveAll 抛出):

Uncaught exception 'Parse\ParseException' with message 'cannot route batch path /1/classes/TestObject'

调试显示 Parse Server returns 错误代码 107 根据 the documentation 表示无效 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.

上创建一个问题

解决方案是写 /parse/classes/ClassName 而不是 /1/classes/ClassName。因此,迁移后,https://parse.com/docs/rest/guide 文档中所述的详细信息已过时。

!!!这可能会在未来改变!!!关注这个问题:https://github.com/ParsePlatform/parse-php-sdk/issues/229

以防万一有人还在寻找这个,这里是 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(),
    ];
}

更改了这两个点后,我能够正确地进行批量保存和删除 运行。我也观察到你之前遇到的同样问题,只是为了确认一下。