使用 Cloud Code 和 PFFacebookUtils 覆盖电子邮件/用户名

Posted

技术标签:

【中文标题】使用 Cloud Code 和 PFFacebookUtils 覆盖电子邮件/用户名【英文标题】:Overriding Email/Username with Cloud Code and PFFacebookUtils 【发布时间】:2014-12-25 00:25:07 【问题描述】:

在使用 Parse 服务时,我试图让用户跳过登录字段,方法是通过 Facebook 登录应用程序并使用 Facebook 信息填写字段。我正在使用 Parse 的 Cloud Code 来使 swift 客户端代码尽可能简单。但是,当我尝试使用云代码设置Parse.User 的用户名和电子邮件地址字段时,我收到了来自Parse.Cloud 的一点回话。在应用内运行时出现以下错误。

[Error]: Can't modify username in the before save trigger (Code: 141, Version: 1.6.1)

当删除用户名功能时,我收到:

[Error]: Can't modify email in the before save trigger (Code: 141, Version: 1.6.1)

通过相同的代码,我还使用相同的方法设置firstNamelastName,没有任何错误。下面是使用的代码。

[云代码]

function pad(num, size) return ('000000000' + num).substr(-size); 

Parse.Cloud.beforeSave(Parse.User, function (request, response) 
    var token = request.object.get("authData").facebook.access_token
    Parse.Cloud.httpRequest(
        url: 'https://graph.facebook.com/v2.1/me?fields=first_name,last_name,email&access_token=' + token,
        success: function(httpResponse) 
             var responseData = httpResponse.data;

             request.object.set("email", responseData.email) // <- Error Occurs Here
             request.object.set("username", responseData.email.split("@")[0].concat(".", pad(Math.floor(Math.random()*10000),4))) // <- Error Occurs Here
             request.object.set("firstName", responseData.first_name)
             request.object.set("lastName", responseData.last_name)

             response.success()
        ,
        error: function()
            response.error("Something went wrong.")
        
    )
)

[SWIFT 代码]

@IBAction func loginWithFacebookButtonAction(sender: AnyObject)
    loginWithFacebookButtonOutlet.setTitle("Logging In...", forState: UIControlState.Normal)
    let permissions = ["public_profile", "user_friends", "email"]
    PFFacebookUtils.logInWithPermissions(permissions, 
        (user: PFUser!, error: NSError!) -> Void in
        if user == nil 
            println("Uh oh. The user cancelled the Facebook login.")
         else if user.isNew 
            println("User signed up and logged in through Facebook!")
            self.performSegueWithIdentifier("facebookToApp", sender: self)
         else 
            println("User logged in through Facebook!")
            self.performSegueWithIdentifier("facebookToApp", sender: self)
        
    )

我在这里遇到的其他问题是当用户尝试使用.save() 而不是response.success() 时引起的,这在这种情况下似乎不是问题。

非常感谢。

【问题讨论】:

我也有同样的问题,你解决了吗? 我已经放弃了这个问题,并假设这是 Parse 用来确保输入完整性的硬编码预防措施。 @ChrisMartin 放弃这个问题,你的意思是你没有设法解决它吗?如果你解决了它,你是怎么做到的? 正如@MahmoudAdam 回答的那样,用户名和电子邮件字段必须是唯一的,因为这似乎是数据库上用户表的键控方式。授予用户对这些字段的访问权限可能会抵消表的完整性。我最终以 api 请求为代价节省了两次。 【参考方案1】:

似乎username & email 不能在beforeSave 触发器中更改,因为它们应该是唯一的

目前,无法在 beforeSave 上修改电子邮件字段,因为该字段应该是唯一的。如果您要使用另一个用户已经在使用的值,这将导致您的 beforeSave 方法无法处理的错误。

参考:https://www.parse.com/questions/why-cant-i-modify-the-email-field-in-a-before-save-trigger

【讨论】:

那么在注册/登录时检索 Facebook 电子邮件和用户姓名的最佳方法是什么?目前我能看到的唯一方法是在用户登录时从客户端执行此操作。即在云代码功能/作业与beforeSave/afterSave 挂钩中执行此操作以规避错误。 我发现email 字段甚至不能以编程方式修改(即使用 Parse JS SDK 从 Node 环境运行脚本。真的很令人沮丧,实际上!

以上是关于使用 Cloud Code 和 PFFacebookUtils 覆盖电子邮件/用户名的主要内容,如果未能解决你的问题,请参考以下文章

使用 Parse Cloud Code 从数组中删除对象

无法使用 Parse Cloud Code 和 Mandrill 发送电子邮件

如何使用 Parse Cloud Code 更新对象的属性?

解析 Cloud Code 关系查询语法

使用 Cloud Code 检索 Parse 对象的一部分

删除 Parse Cloud Code 中的其他文件