解析找不到用户记录,然后在尝试创建它时出错。我哪里做错了?

Parse can't find user record, then errors when trying to create it. Where did I go wrong?

我是 Parse 的新手,同时也在努力思考 promise。我想做的只是在数据库中创建一个用户,如果一个用户不存在,如果一个用户存在,我会更新该行。我遇到的问题是我的 Parse.Query 从来没有找到用户行,然后当它找不到该行时,它就无法创建新用户,因为该行存在。我知道这是因为我需要强制方法等待搜索 return 或 return 承诺在查询 return 时执行,但我无法弄清楚怎么做。

我当前的代码是:

Parse.Cloud.define("findUser2", async req => {
  var phoneNumber = req.params.phoneNumber;
  phoneNumber = phoneNumber.replace(/\D/g, '');

  console.log("Incoming phone number is: " + phoneNumber)

  var userQuery = new Parse.Query(Parse.User);
  userQuery.equalTo('username', phoneNumber);

  var user = await userQuery.first();
  if(user) {
    console.log("Found a user, user is: " + user);
    //Validation stuff goes here
  } else {
    console.log("Did not find a user, create and return it");
    var newUser = new Parse.User();
    newUser.setUsername(phoneNumber);
    newUser.setPassword(secretPasswordToken + phoneNumber);
    newUser.set("language", "en");
    newUser.setACL({});
    newUser.save();
    //If this is not commented out, fails with:
    //Error: Cannot create a pointer to an unsaved ParseObject
    //user = newUser;
  }
  console.log("about to return the user");
  return user;
});

然后输出returns:

app[web.1]: Incoming phone number is: 5555551212
app[web.1]: Did not find a user, create and return it
app[web.1]: about to return the user
app[web.1]: info: Ran cloud function findUser2 for user undefined with:
app[web.1]: Input: {"phoneNumber":"5555551212"}
app[web.1]: Result: undefined {"functionName":"findUser2","params":{"phoneNumber":"5555551212"}}
app[web.1]: error: Parse error: Account already exists for this username. {"code":202,"stack":"Error: Account already exists for this username.\n    at /app/node_modules/parse-server/lib/RestWrite.js:567:13\n    at processTicksAndRejections (internal/process/task_queues.js:85:5)"}
app[web.1]: (node:23) UnhandledPromiseRejectionWarning: Error: Account already exists for this username.

根据日志的顺序,我知道它在完成查询之前正在退出函数。我认为 await 会强制它在这个查询 returns 或超时之前不会继续,从而能够履行承诺。看来我错了,我不确定如何解决这个问题。

理想情况下,我会使用 Promises,因为我可以让我的代码 运行 更有效,但我现在一直在等待,因为我希望它能让它更简单地工作并且很好对于原型。我正在寻找一条好的前进道路,如果正确的方法是 return 一个承诺,我想知道。

在实际保存新用户之前,您的云代码功能正在返回。您只需要 await 即可返回。应该是这样的:

Parse.Cloud.define("findUser2", async req => {
  var phoneNumber = req.params.phoneNumber;
  phoneNumber = phoneNumber.replace(/\D/g, '');

  console.log("Incoming phone number is: " + phoneNumber)

  var userQuery = new Parse.Query(Parse.User);
  userQuery.equalTo('username', phoneNumber);

  var user = await userQuery.first({ useMasterKey: true });
  if(user) {
    console.log("Found a user, user is: " + user);
    //Validation stuff goes here
  } else {
    console.log("Did not find a user, create and return it");
    var newUser = new Parse.User();
    newUser.setUsername(phoneNumber);
    newUser.setPassword(secretPasswordToken + phoneNumber);
    newUser.set("language", "en");
    newUser.setACL({});
    await newUser.save(); //This is the line you need to change
    //If this is not commented out, fails with:
    //Error: Cannot create a pointer to an unsaved ParseObject
    //user = newUser;
  }
  console.log("about to return the user");
  return user;
});