从Parse云代码更新用户对象不保存

时间:2015-12-11 06:22:58

标签: parse-platform cloud-code parse-javascript-sdk

目前我正在尝试从解析云代码更新用户名和密码,但在parse.com控制台中我看到了成功消息,但该对象实际上并未保存在parse.com数据库中。以下是 cloud / main.js

的内容
// code to update username
Parse.Cloud.define("updateUserName", function(request, response){
if(!request.user){
    response.error("Must be signed in to update the user");
    return;
}
Parse.Cloud.useMasterKey();
var userId = request.params.id;
var userName = request.params.userName; 
// var User = Parse.Object.extend("User");
var updateQuery =  new Parse.Query(Parse.User); 
updateQuery.get(userId,{
    success: function(userRecord){
        console.log(userRecord.get("id"));
        userRecord.set("username", userName);
        // userRecord.set("resetToken", "Apple");
        userRecord.save(null,{
            success: function(successData){                 
                response.success("username updated successfully.");
                // userRecord.fetch();                  
            },
            error: function(errorData){
                console.log("Error while updating the username: ",errorData);

            }
        });

    },
    error: function(errorData){
        console.log("Error: ",errorData);
    }
});
});

Parse.Cloud.define("resetPassword", function(request, response){
var successMsg = "";
if(!request.user){
    response.error("Must be signed in to update the user");
    return;
}
Parse.Cloud.useMasterKey();
var resetToken = request.params.resetToken;
var password = request.params.password; 
// var User = Parse.Object.extend("User");
var updateQuery =  new Parse.Query(Parse.User);
// updateQuery.equalTo("resetToken", resetToken);
updateQuery.get(resetToken,{
    success: function(userRecord){
        // console.log(userRecord.get("id"));
        // userRecord.set("password",password)
        userRecord.set("password",password);          
        userRecord.save(null, {
            success: function(successData){
                successMsg = "Password Changed !";
                console.log("Password changed!");
                userRecord.set("resetToken", "");
                userRecord.save();
            },
            error: function(errorData){
                response.error("Uh oh, something went wrong");
            }
        })


    },
    error: function(errorData){
        console.log("Error: ",errorData);
    }
});
response.success(successMsg);
});

代码实际运行时没有任何错误,但它没有更新数据库中的值。以下是我在 js / index.js

中调用这些云函数的方法
$(".update-user").click(function(){
   Parse.Cloud.run("updateUserName", {id: $(this).data("id"), username:   $(".uname").val()},
       {
         success: function(successData){
         console.log("username updated successfully.");
         $("#editModal").modal("hide");
         $(".edit-modal").hide();
       },
       error: function(errorData){
       }
   });
});

我在firefox控制台username updated successfully.中看到的内容 我在parse.com控制台中看到的内容

I2015-12-11T06:15:13.361Z]v106 Ran cloud function updateUserName for user chfgGhaPEl with:
Input: {"id":"MAvm9FlGgg","username":"testuser12"}
Result: username updated successfully.

但是这行代码userRecord.set("resetToken", "Apple");正在更新数据库中的resetToken列,但为什么不让我更新用户名/密码(或我没有尝试更新的其他列)列?

3 个答案:

答案 0 :(得分:3)

我分析你的代码。而不是使用get来检索相关用户,首先使用您指定用户ID作为查询约束的位置。下面是一个示例(工作)代码,其中用户信息在Parse User表中更新。希望这会有所帮助。

问候。

Parse.Cloud.define("updateUser", function(request, response) 
{
  Parse.Cloud.useMasterKey();
  var query = new Parse.Query(Parse.User);
  var objectId = request.params.objectId;
  var username = request.params.username;
  var email = request.params.email;
  var userType = request.params.userType;
  var password = request.params.password;

  query.equalTo("objectId", objectId);
  query.first({
      success: function(object) 
      {
        object.set("username", username);
        object.set("email", email);
        object.set("userType", userType);
        object.set("password", password);
        object.save();
        response.success("Success");
      },
    error: function(error) {
      alert("Error: " + error.code + " " + error.message);
      response.error("Error");
    }
  });
}); 

答案 1 :(得分:0)

对我有用的是

//cloud/main.js
Parse.Cloud.define("updateUserName", function(request, response){
if(!request.user){
    response.error("Must be signed in to update the user");
    return;
}
if(request.params.IsAdmin == false){
    response.error("Only the administrators can edit username.");
    return; 
}
Parse.Cloud.useMasterKey();
// var userId = request.params.Id; --> I guess he was the main culprit,  the params and the actual column value should match. Instead of passing Id from my client code(see below) I just passed objectId and it worked.
var userId = request.params.objectId;
// var userName = request.params.username;  
var name = request.params.name;
// var User = Parse.Object.extend("User");
var updateQuery =  new Parse.Query(Parse.User); 
console.log("id from params: "+userId);
updateQuery.equalTo("objectId", userId);
updateQuery.first({
    success: function(userRecord){          
        // userRecord.set("username", userName);
        userRecord.set("name", name);           
        userRecord.save(null,{
            success: function(successData){                 
                response.success("username updated successfully.");
                userRecord.fetch();                 
            },
            error: function(errorData){
                console.log("Error while updating the username: ",errorData);

            }
        });         

    },
    error: function(errorData){
        console.log("Error: ",errorData);
        response.error(errorData);
    }
});
});

// js/index.js
/* initially I was using Id instead of objectId, the field names are case
sensitive
Parse.Cloud.run("updateUserName", {id: $(this).data("id"), name:   $(".name").val(),IsAdmin: Parse.User.current().get("IsAdmin") },*/
Parse.Cloud.run("updateUserName", {objectId: $(this).data("id"), name: $(".name").val(),IsAdmin: Parse.User.current().get("IsAdmin") },
        {
            success: function(successData){
                console.log("username updated successfully.");
                $("#editModal").modal("hide");
                $(".edit-user-server-error").html("");
                $(".edit-modal").hide();
                location.reload();                    
            },
            error: function(errorData){
                console.log(errorData);
                $(".edit-user-server-error").html("");
                $(".edit-user-server-error").html(errorData.message);

            }
        });

所以我提到了这个post并且它给了我一个提示,基于我只做了一次试验和错误的事情并且让它发挥作用。

  

您可以将参数中的任何类型的值传递给此Cloud Function,因此您可能希望以这种方式准确指定要更新的属性。另外,不要忘记实际验证request.user是否允许执行此类操作。

答案 2 :(得分:0)

Parse不支持HTTP PUT请求来保存数据。因此,我们需要使用包含方法调用的PUSH请求来保存数据。

但是,在调用save方法之前,必须有一行 Parse.Cloud.useMasterKey();