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

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

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

我试过了:

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

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

【问题讨论】:

    标签: parse-server parse-cloud-code


    【解决方案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
          })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2016-08-22
        • 1970-01-01
        相关资源
        最近更新 更多