Parse 无法检索用户电子邮件

Parse can't retrieve user email

我使用的是最新版本的 Parse Server,在发布 .js 文件之前进行了 Typescript 编译。请注意,这整个问题特定于 Cloud Code,而不是客户端实现。

到目前为止,这一直运行良好,但现在我发现了一个我真的不知道如何解决的问题。考虑一个用于处理电子邮件事件的 class,它有一个方法可以找到给定 ID 的用户电子邮件,并向他发送消息:

async sendEmailToUserID(userId: string, subject: string, text: string){

    const res = await new Parse.Query("User").equalTo("objectId", userId).find();
    if(res){
        const user = res[0];
        const email =  user.get("email");
        return await this.sendEmail(email, subject, text);
    }
}

我认为这个函数非常简单明了,很容易解释。好吧,事实是,find() 函数可以正确检索用户的对象,但是 .get("email") 永远不会起作用:它总是 returns "undefined".

有人知道为什么会这样吗?

PD:是的,任何给定用户都存在 "email" 字段。

好的,花了一段时间才知道如何找到它,因为 Parse 没有任何专门用于此的错误。问题是我试图在不使用主密钥的情况下访问受保护的 User class 对象。

请注意,以下解决方案仅适用于 Cloud Code;从客户端代码使用它绝对不安全:

只需将 {useMasterKey: true} 添加到 .find() 方法即可:

const res = await new Parse.Query("User").equalTo("objectId", userId).find({useMasterKey: true});

电子邮件是一个敏感字段,在发送给匿名请求的客户端之前会从服务器中删除。

正如您所注意到的,您可以将 'userMasterKey' 添加到客户端查询中,但是您永远不应该这样做,因为 masterKey 是一个秘密,您的解析服务器的整个安全性取决于保密(例如密码)。

在服务器上、在云代码中或在 php 服务器上使用主密钥进行查询是可以的,但是在客户端代码中使用主密钥是绝对不行的(ios, 浏览器中的js, android, 等等)

您可以让经过身份验证的用户可以使用电子邮件和其他敏感字段。这是一个新功能,还没有很好的文档记录,但您可以从测试中看到它是如何使用的:https://github.com/parse-community/parse-server/blob/f2c332ea6a984808ad5b2e3ce34864a20724f72b/spec/UserPII.spec.js#L526