迁移后无法执行批处理操作


Can't perform batch operations after migration

我最近完成了将我的 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",消息"无法路由批处理路径/1/classes/TestObject"

调试显示解析服务器返回错误代码 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 上创建一个问题。

解决方案是写/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'];
}

解析对象.php private static function destroyBatch(array $objects, $useMasterKey = false)

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

随着这两个位置的改变,我能够让批量保存和删除正常运行。我也观察到了你之前遇到的同样的问题,只是为了确认。