2

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

Can't modify username in the before save trigger

这很不言自明,对吧?只是我不会在任何地方修改用户名,无论是在触发器、云功能还是在我的 iOS 应用程序的客户端。我什至不访问或使用它。不过,使用我的云代码添加字段成功创建了用户。但有时我只是得到这个错误:

Validation Failed

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

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();
    }
});
4

1 回答 1

1

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

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

删除user.save()呼叫,然后呼叫response.success()

于 2014-11-14T16:30:07.427 回答