解析服务器 + 云代码:Parse.Object 上的 beforeSave()

Posted

技术标签:

【中文标题】解析服务器 + 云代码:Parse.Object 上的 beforeSave()【英文标题】:Parse Server + Cloud Code: beforeSave() on Parse.Object 【发布时间】:2017-05-11 12:53:38 【问题描述】:

我担心我知道这个问题的答案,但我会把它扔在这里。有没有办法让 beforeSave 方法使用 Cloud Code 在所有 Parse.Object 子类上触发?

所以我想在所有保存上运行一些代码,而不是 Parse 对象的任何特定子类。

我试过了:

Parse.Cloud.beforeSave(Parse.Object, function(request, response) 

...但它似乎没有被触发。

【问题讨论】:

【参考方案1】:

我从来没有听说过这个,坦率地说,没有看到太多好处。第一个参数应该与类名匹配,所以我怀疑是否有开箱即用的解决方法。

不过,您确实应该将所有 beforeSave 分开。我们在我们的云代码中为每个类创建一个单独的文件夹,并为每个类提供一个控制器(beforeSave、afterSave、与该类直接相关的云函数),该控制器具有调用其他 Repos 的云函数,这些 Repos 处理不同类的逻辑。 Controller 是唯一应该触及其他类的 Repos 的文件。

然后是每个类的 Repo,它处理执行特定任务/逻辑,并经常保存或获取对象。

然后是工厂文件,它们不进行保存、提取和额外调用。他们只使用传入的可用数据执行业务逻辑。

每次你创建一个新的 Parse 类时,我都会养成设置那个控制器的习惯,你可以在那里添加一个 beforeSave 触发器。

【讨论】:

... 大概你必须从 main.js 触发这些控制器的方法? (对不起,通常不是 JS 人)。无论哪种方式,在这种情况下,我都需要对所有保存的对象执行相同的操作,这使得为每种类型维护单独的代码库似乎有点过头了。并且文档确实说我们可以提供 Parse 定义的 JS 对象的类名(他们的示例是 Parse.User),所以我希望 Parse.Object 在这里工作......但可惜它没有。 Parse.User 是 Parse.Object 的特定子类,但在该上下文中使用时会转换为“_User”。对于您的特定需求来说,这似乎有点过头了,但这是维护代码库时的最佳实践。并考虑您是否有 100 个具有通用 beforeSave 的类。当您只需要其中一个定制的东西时会发生什么?它破坏了整个设置。分开 beforeSave's 显然是正确的选择。为了使所有 Parse.Cloud 端点都可以从其他文件中使用,您需要在 main 顶部包含它们所在的文件。 我的 main.js 的顶部有几行像var customClassController = require('./CustomClass/customClassController.js'); 您可以使用 CLP 以及角色和指针权限恕我直言。否则: ['Class1', 'Class2', 'Class3'].forEach((className) => Parse.Cloud.beforeSave(className, mySecurityFunction); );另外,我猜你不会每天都创建新课程吧? 请记住 CLP 和 ACL 的工作方式是用户必须首先通过 CLP(通过角色、公共访问或指针权限),然后必须通过特定的 ACL目的。因此,您可以对用户的特定对象拥有 ACL 权限,但如果 CLP 不允许公共读/写,并且您没有为该类传递指针或角色权限,您仍然无法找到/获取/写入该对象。听起来您只需要修改 ACL 以获得角色的适当权限,如果只有几个用户应该具有访问权限,请使用指针权限。【参考方案2】:

不,你不能。 您只能触发用户定义的类和预定义的类。 如果类是用户定义的,第一个参数必须是字符串 例如

Parse.Cloud.beforeSave("Car", function(request, response) 
...

如果类是预定义的,第一个参数必须 Parse.ClassName 例如

Parse.Cloud.beforeSave(Parse.User, function(request, response) 
...

【讨论】:

【参考方案3】:

您可以首先查询schema(请参阅this post)获取所有类名,然后使用forloop 为每个类添加beforeSave 挂钩。在伪代码中:

var classNames = getClassNamesFromSchemaQuery();
classNames.foreach(var classObject)
    Parse.Cloud.beforeSave(classObject.className, (req, resp)
        // resto of the code here
    )

【讨论】:

以上是关于解析服务器 + 云代码:Parse.Object 上的 beforeSave()的主要内容,如果未能解决你的问题,请参考以下文章

创建 Parse.Object 新的解析服务器

解析服务器全文搜索 - 生成响应时出错。错误:需要搜索字词

克隆解析服务器对象

解析json数组响应/颤动

解析服务器Javascript API发布到指针

解析云代码如何与解析服务器一起工作?