如何创建一种方法来检索客户端和服务器上可用的用户电子邮件地址?

How can I create a method for retrieving user email address that is available on the client and server?

我在我的网站上打开了 facebook、google 和常规 registration/login。我遇到的问题是电子邮件地址存储在不同的字段中,具体取决于用户首次加入的方式。

对于普通用户,它在字段 emails[0].address 中。对于 facebook 和 google 个经过身份验证的用户,它位于 services[0].email.

字段中

在客户端(模板、事件)和服务器(方法)的不同位置,我只想调用一种方法来确定要使用的字段和 returns 电子邮件地址。我也想为验证字段做类似的事情。

我对 meteor 还很陌生,到目前为止我发现执行上述操作的唯一方法是在客户端和服务器上重复相同的逻辑,这对我来说不太合适。

如果他们第一次使用 facebook、google 或其他服务登录,最好的办法是将电子邮件地址转移到 'emails'。如果您添加其他服务,这也会使其更具未来证明,因为流星将始终使用 emails.address(包括在其他包中)

服务器端代码:

Accounts.onCreateUser(function(user) {

    user.emails = user.emails || []; //If its null set it to an empty array

    if(user.services.facebook) {
        user.emails.push({address: user.services.facebook.email, verified: false});
    }else if(user.services.google) {
        user.emails.push({address: user.services.google.email, verified: false});
    }

    return user;

});

那你每次都检查Meteor.user().emails[0].address就可以了

注意:如果由于 autopublish 包而未发布,您可能必须发布 emails 字段才能在客户端上运行。

对于之前已经登录的用户,您可能还需要 运行 这是第一次:

Meteor.startup(function() {
    Meteor.users({'emails':{$exists: false}}).fetch().forEach(function(user) {
        var email = (user.services.facebook || user.services.google).email;

        if(email) Meteor.users.update({_id: user._id},{$push:{emails:{address: email, verified: false}}});
    });
});

我不确定 facebook 和 google 是否都在 services 键中使用 email,如果他们这样做的话,上面的方法应该可以正常工作。如果他们不这样做,您可以编辑用于 google 或 facebook 的密钥,以防万一 emailAddress 而不是 email 例如。