2016-01-21 52 views
2

我在运行Cloud代码中的某个功能时遇到问题。它应该检查对象的存在,如果它确实存在,创建一个新用户:无法将对象保存在云代码中

Parse.Cloud.define("createUser", function(request, response) { 

    // Query the existing company by id 
    var query = new Parse.Query(Parse.Object.extend("Company")); 
    query.equalTo("objectId", request.params.company.existing.id); 
    query.find().then(function(result){ 

     var user = new Parse.User(); 

     user.set("username", request.params.username); 
     user.set("password", request.params.username); 
     user.set("email", request.params.email); 
     user.set("permissions", ["User"]); 

     var company = result[0]; 

     user.signUp(null, { 
      success: function(user){ 
       // Asign company ACL for User write permission 
       var cACL = company.getACL(); 
       cACL.setWriteAccess(user.id, true); 
       company.setACL(cACL); 
       // Save company 
       company.save(); 
       console.log(company); 

       // Establish user-company relationship 
       var cRelation = user.relation("associated"); 
       cRelation.add(company); 
       // Save user 
       user.save(); 
       console.log(user); 

       // Finish 
       response.success(user); 
      }, 
      error: function(user, error){ 
       response.error(JSON.stringify({code: -8000, message: "User creation failed"})); 
      } 
     }); 

    }, function(error){ 
     response.error(JSON.stringify({code: -8001, message: "Invalid company"})); 
    }); 

}); 

我第一次查询解析所述对象的存在。如果确实存在,则使用收到的参数创建一个新用户。在用户创建的完成块中,我分配了适当的 ACL(到公司对象),并稍后保存它们。这是我遇到第一个问题时: ACL不保存(在仪表板中选中)。我公司为console.log调试目的,它显示 ACL正确设置。所以我认为它必须是保存问题

注意:用户已创建,但无论我以后尝试做什么都行不通。

后来我这个对象添加到先前在仪表板中定义的关系,但我有,同样的问题:关系不上来仪表板,即使当我console.log对象就说明这种关系是正确的。

我迷失在这里。我不明白为什么这不起作用,我已经阅读了大量的在线文档,仍然无法找到答案。

回答

2

好吧,经过一天的工作,我终于找到了我的问题。我有ACL设置无处不在,我没有保存我试图保存的对象的特权。 因此,节省确实是失败的

我应该注意,如果您遇到同样的问题,您可以使用主密钥轻松解决此问题。为此,您需要在执行任何必须进行身份验证的请求之前调用Parse.Cloud.useMasterKey()

这仅适用于云代码,你一定要知道自己在做什么,当你使用主密钥,因为它基本上是给读取和写入权限给任何人,任何地方,一切。所以要确保你的逻辑是完美无瑕的,因为如果没有明智地使用它,你可能会遇到很大的安全问题。由于本叔叔说:随着巨大的权力来承担巨大的责任

希望这可以帮助别人。

+0

对于任何在2017年阅读此文的人,我想提及'Parse.Cloud.useMasterKey()'已停用,并且您应该将'{useMasterKey:true}'作为选项传递给您希望运行的任何函数升高。 –