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常见问题及解决方法
如何在 Parse-Server 中实现“protectedFields”?
如何使用 iptables 和 parse-server (Parse Server) 将 HTTP 重定向到 HTTPs