2

我最近完成了将我的 Parse PHP 应用程序迁移到 Google Cloud 托管的 Parse 服务器。从那时起,在大多数情况下,像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”

调试显示 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 上创建一个问题。

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 做了一些剥离。具体来说,它会检查您的 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'];
}

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

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

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

于 2016-06-17T18:18:09.477 回答