parse-server:如何区分用户类 BeforeSave 中的 signUp 和常规 ParseUser.save?

Posted

技术标签:

【中文标题】parse-server:如何区分用户类 BeforeSave 中的 signUp 和常规 ParseUser.save?【英文标题】:parse-server: How to differentiate between signUp and regular ParseUser.save in User class BeforeSave? 【发布时间】:2016-11-29 23:26:24 【问题描述】:

这是 parse-server 的行为与 Parse.com 不同的问题。 我的应用中有匿名用户,当使用 ParseUser.signUp (android SDK) 时,parse-server 和 Parse.com 之间存在重要区别。 Parse.com 会首先检查用户名冲突,如果有冲突,甚至不会调用 beforeSave 函数。这让我可以在 beforeSave 代码中做出一些假设。

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

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

总结一下:如何在 User 类 beforeSave 中判断是否调用了 signUp 或常规保存?

【问题讨论】:

能否为 beforeSave 添加您的云代码? 我也有同样的问题。是否可以以某种方式在对象的属性上调用request.object.existed()?这会有所帮助。 【参考方案1】:

您可以尝试在 beforeSave 中使用 .existed() 函数吗?

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

【讨论】:

这行不通,因为 exists() 将始终返回 true,因为在我让他能够注册之前,我将他保存为匿名用户。【参考方案2】:

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

    验证authData 对象是否包含anonymous 键告诉我们是否保存了匿名用户。注册后,authData 即为undefined

    var authData = request.object.get("authData"); if (authData != undefined && authData.anonymous != undefined) console.log("#### 用户是匿名的"); response.success(); // 保存并返回 返回;

要确定用户是否刚刚注册,您需要比较电子邮件地址是否已设置(未更改但之前未定义)。您可以通过向request.original 询问电子邮件来做到这一点:

// 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");
    …

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

【讨论】:

以上是关于parse-server:如何区分用户类 BeforeSave 中的 signUp 和常规 ParseUser.save?的主要内容,如果未能解决你的问题,请参考以下文章

Parse-Server后台搭建与使用进阶篇(二)- Parse-server常见问题及解决方法

iOS Swift Parse-Server 用户登录认证

如何使用 Parse Server 设置类级别权限?

如何在 Parse-Server 中实现“protectedFields”?

Parse-Server可防止自动添加字段

如何使用 iptables 和 parse-server (Parse Server) 将 HTTP 重定向到 HTTPs