Cloud Code 保存用户时出错

Cloud Code Error in Saving user

我的云代码中有一个函数可以使用,但我不确定如何解决与之相关的问题。

原题:

Parse.Cloud.define("assignTokenToUser", function(request, response) {
    console.log("Inside assignTokenToUser");
    var token = Math.random().toString(30).substring(7);
    query = new Parse.Query("User"),
    email = request.params.email;

    query.equalTo("username", email);


   query.find({ useMasterKey: true }).then(function(results) {
      query.first({
        success: function(user) {
          // Successfully retrieved the object.
          user.set("emailToken", token);
          user.save();
          console.log("success...");
          response.success(token);
        },
        error: function(error) {
          console.log("error 1...");
          response.error(error);
        }
      });
   }, function(error) {
     console.log("error 2...");
     response.error(error);
   });
});

网上一查好像是个通病,我分析是每次使用query对象都要传useMasterKey。相应地,我的日志文件显示,在尝试保存用户时,它给出了 Code 206 错误。

日志文件输出:

Inside assignTokenToUser
success...
^[[32minfo^[[39m: Ran cloud function assignTokenToUser for user undefined with:
  Input: {"email":"maryam.zafar@emumba.com"}
  Result: "p66qm34jd80p0j6ne03fe1q7f" functionName=assignTokenToUser, email=maryam.zafar@emumba.com, user=undefined
going to send an email... with result: p66qm34jd80p0j6ne03fe1q7f
fullLink: https://beatthegym.com/emailVerified?username=maryam.zafar@emumba.com&token=p66qm34jd80p0j6ne03fe1q7f
^[[31merror^[[39m: Error generating response. ParseError { code: 206, message: 'Cannot modify user 4m0VZFsKVt.' } code=206, message=Cannot modify user 4m0VZFsKVt.
[object Object]

所以我继续将我的代码更改为以下内容:

代码:

Parse.Cloud.define("assignTokenToUser", function(request, response) {
     console.log("Inside assignTokenToUser");
    var token = Math.random().toString(30).substring(7);
    query = new Parse.Query("User"),
    email = request.params.email;

    query.equalTo("username", email);


    query.find({ useMasterKey: true }).then(function(results) {
      console.log("inside query.find...");
      query.first(null, { useMasterKey: true }).then(function(user) {
          console.log("inside query.first...");
          // Successfully retrieved the object.
          user.set("emailToken", token);
          user.save(null, { useMasterKey: true }).then(function() {
             console.log("inside user.save...");
             response.success();
          }, function(error) {
                response.error(error);
          });
          response.success(token);
        },
        function(error) {
          console.log("error 1...");
          response.error(error);
        });
   }, function(error) {
     console.log("error 2...");
     response.error(error);
   });
 });

日志文件:

Inside assignTokenToUser
inside query.find...
inside query.first...
^[[32minfo^[[39m: Ran cloud function assignTokenToUser for user undefined with:
  Input: {"email":"maryam.zafar@emumba.com"}
  Result: "tqc8m9lo2tcsrqn69c3q0e1q7f" functionName=assignTokenToUser, email=maryam.zafar@emumba.com, user=undefined
inside user.save...
^[[32minfo^[[39m: Ran cloud function assignTokenToUser for user undefined with:
  Input: {"email":"maryam.zafar@emumba.com"}
  Result: undefined functionName=assignTokenToUser, email=maryam.zafar@emumba.com, user=undefined
[object Object]

现在,日志文件为我提供了一个用户 "undefined",对该函数的调用在 Inspector 工具的 Chrome 网络选项卡中为我提供了待处理状态,直到它变成502,然后浏览器再次自动生成请求。所有其他请求都会得到正确的 200 响应。

但是,数据似乎已保存。针对此电子邮件地址的记录保存了正确生成的令牌。但是来自浏览器的请求失败并且用户是 "undefined" 而在原始日志文件中,我看到正确的用户 ID ...每次失败时,该功能都会自动再次运行(因为浏览器每次都会生成另一个请求它得到一个 502) 并且因为它实际上应该发送一封电子邮件,所以它 运行 一次又一次地继续生成无限的电子邮件...

提前谢谢你..

终于明白了:

用户将保持未定义状态,除非我使用 Parse.User.current() 方法获取它。数据确实保存到数据库中,因为它是对记录的强制更新,但是在使用 current() 方法对用户进行身份验证之前,它将保持未定义状态。

我看到这是一个旧的 post 但我在代码中发现了明显的错误:

query = new Parse.Query("User")

应该是:

query = new Parse.Query(Parse.User)

或至少:

query = new Parse.Query("_User")

因为 User 是 Parse 中预定义的 class。