解析错误:"无法在保存触发器之前修改用户名"和"验证失败"

时间:2014-10-28 21:37:07

标签: javascript parse-platform cloud-code

我正在尝试保存用户(从Facebook中提取一些数据并将其添加到某些列,其中没有与Parse用户名相关)在Parse的beforeSave触发器中云,但我在注册时在我的iOS应用程序中收到以下错误:

Can't modify username in the before save trigger

这是非常自我解释的,对吧?只是因为我在任何地方修改用户名这一事实,无论是在我的iOS应用程序中的触发器,云功能还是客户端。我甚至没有访问或使用它。使用我的云代码添加字段成功创建了用户。但有时我只是得到这个错误:

Validation Failed

然后,我的用户对象似乎没有保存。两个错误都是随机发生的,我的测试用户是相同的。我甚至在整个项目中搜索了“用户名”这个词,以确保我没有直接或间接地将它设置在某处。我不是在任何地方保存它。这是一个Parse bug,还是我错过了一些明显的东西?这是我的完整代码:

Parse.Cloud.beforeSave(User, function(request, response) {
    var user = request.object;
    if(typeof user.get("nickname") == "undefined" || user.get("nickname") == null){
      var randomNick = "User " + Math.floor(Math.random() * 1000000);
      user.set("nickname", randomNick);
    }
    if(user.get("facebookId") == undefined){
      var token = user.get('authData')['facebook']['access_token'];
      Parse.Cloud.httpRequest({
        url: 'https://graph.facebook.com/v2.1/me?fields=id,gender,name&access_token=' + token,
        success: function(httpResponse) {
          var responseData = httpResponse.data;
          user.set("facebookId", responseData.id);
          user.set("realName", responseData.name);
          if(responseData.gender !== undefined){
            user.set("gender", responseData.gender);
          }
          var acl = new Parse.ACL();
          acl.setPublicReadAccess(false);
          user.setACL(acl);

          user.save(null, {
            useMasterKey:true,
            success: function(){response.success()},
            error: function(o,e){response.error("error: " + e)}
          });
        },
        error: function(httpResponse) {
          console.error('Request failed with response code ' + httpResponse.status);
        }
      });
    }else{
      response.success();
    }
});

1 个答案:

答案 0 :(得分:1)

可能的问题是您试图在beforeSave触发器中保存对象;你不需要保存它,你只需要修改它然后调用response.success()让Parse.com知道继续保存操作。你得到的错误可能是因为它试图创建两次相同的用户 - 尽管这只是猜测。

有关详细信息,请参阅https://parse.com/docs/cloud_code_guide?language=JavaScript#functions-onsave

删除user.save()来电,然后致电response.success()