Parse platform 解析服务器:如何区分注册和常规的ParseUser.save,在用户类中保存,然后再保存?

Parse platform 解析服务器:如何区分注册和常规的ParseUser.save,在用户类中保存,然后再保存?,parse-platform,parse-server,Parse Platform,Parse Server,这是一个parse server与parse.com行为不同的问题。 我的应用程序中有匿名用户,当使用ParseUser.signUp(Android SDK)时,parse服务器和parse.com之间有一个重要的区别。Parse.com将首先检查用户名冲突,如果存在冲突,甚至不会调用beforeSave函数。这允许我在beforeSave代码中进行一些假设 现在在parse server中,总是调用beforeSave,只有在I response.success()之后,它才能保存它。 问题

这是一个parse server与parse.com行为不同的问题。 我的应用程序中有匿名用户,当使用ParseUser.signUp(Android SDK)时,parse服务器和parse.com之间有一个重要的区别。Parse.com将首先检查用户名冲突,如果存在冲突,甚至不会调用beforeSave函数。这允许我在beforeSave代码中进行一些假设

现在在parse server中,总是调用beforeSave,只有在I response.success()之后,它才能保存它。 问题是,如果内部注册失败(例如,重复用户名),有些代码不应该发生,但无论如何都会发生,因为我假设如果调用beforeSave,用户名是唯一的。我的解决方案是通过对用户名的ParseQuery进行自我检查,但现在还有另一个问题——如何区分匿名用户和新用户

在我的应用程序中,每个新用户都会自动保存为匿名用户。对于匿名用户,有些事情你不能做(例如更改用户名)。过了一段时间,当他想注册时,他输入了一个用户名,在beforeSave中,我无法判断他是只想更改用户名,还是正在注册?如果他想注册,我应该允许他设置用户名,但如果他只是想更改用户名,那么我会拒绝更改


总结一下:如何在用户类beforeSave中判断是调用了注册还是常规保存?

能否尝试在beforeSave中使用.existed()函数

Parse.Cloud.afterSave(Parse.User, function(request) {
    if(!(request.object.existed())){
      //Not sure what anonymous user would return here...
    }
});

我在文档中找不到任何明显的内容,但在分析beforeSave钩子的请求对象后,我找到了一个解决方案:

  • 验证
    authData
    对象是否包含匿名密钥会告诉我们是否保存了匿名用户。一旦注册,
    authData
    未定义

    var authData=request.object.get(“authData”); if(authData!=未定义&&authData.anonymous!=未定义){ log(“用户是匿名的”); response.success();//保存并返回 返回; }

  • 要确定用户是否刚刚注册,您需要比较电子邮件地址是否已设置(未更改,但之前未定义)。您可以通过询问
    请求来实现此目的。电子邮件的原始版本为:

    // object now has an email for the first time
    if (request.object.get("email") != undefined &&
        request.original.get("email") == undefined) {
        console.log("#### User signed up");
        …
    }
    

    我不确定推荐的方法是什么,但这似乎可以将匿名用户与真实的已注册用户区分开来。

    能否为beforeSave添加云代码?我也有同样的问题。是否可以对对象的属性调用
    request.object.existed()
    ?这会有帮助。这不会起作用,因为existed()将始终返回true,因为在我给他注册的能力之前,我将他保存为匿名用户。