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

时间:2016-03-03 01:00:31

标签: php json parse-platform parse-server

我最近完成了将Parse PHP应用程序迁移到Google Cloud托管的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抛出错误):

  

未捕获的异常' Parse \ ParseException'带消息'无法路由批处理路径/ 1 / classes / TestObject'

调试显示Parse Server返回错误代码107 ,根据the documentation表示无效的JSON。我不熟悉REST API,但对于此示例,发送的数据是

  

{"请求":[{"方法":" POST""路径":" / 1 /类/的TestObject""主体":[]},{"方法":" POST""路径":&#34 ; / 1 /类/的TestObject""主体":[]},{"方法":" POST""路径&#34 ;:" / 1 /类/的TestObject""主体":[]}]}

哪个是有效的JSON。

批量操作在迁移之前正常工作。 PHP版本是5.6。任何帮助表示赞赏。如果可以重现错误,我将在GitHub上创建一个问题。

2 个答案:

答案 0 :(得分:6)

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

!!!这可能在未来发生变化!密切关注这个问题:https://github.com/ParsePlatform/parse-php-sdk/issues/229

答案 1 :(得分:2)

万一有人还在寻找这个,这里是从github发布的解决方案。

我进一步挖掘了这个。事实证明,服务器对它收到的批量请求的URL进行了一些剥离。具体来说,它会检查您的api前缀(在大多数情况下为/parse)是否与发送的内容相匹配。对于批处理请求,单个请求不包含此请求,并且最终导致此匹配失败。测试你上面提到的代码,我能够修补它。它有效,但我可能会看到我将来是否能写出更好的补丁。

您目前需要将api前缀添加为/your_prefix/(在大多数情况下,这是/parse,但在两个地方使用已为您的服务器设置的api前缀)保存和删除如下。

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(),
    ];
}

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

相关问题