解析服务器 + 云代码: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)获取所有类名,然后使用for
loop 为每个类添加beforeSave
挂钩。在伪代码中:
var classNames = getClassNamesFromSchemaQuery();
classNames.foreach(var classObject)
Parse.Cloud.beforeSave(classObject.className, (req, resp)
// resto of the code here
)
【讨论】:
以上是关于解析服务器 + 云代码:Parse.Object 上的 beforeSave()的主要内容,如果未能解决你的问题,请参考以下文章