在 meteor 中获取 facebook 信息

Get facebook information in meteor

我正在使用 Meteor.loginWithFacebook

用户存储为:

{
    "_id" : "cnzMXwmvtF42Dfy4q",
    "createdAt" : ISODate("2016-08-31T15:58:00.814Z"),
    "services" : {
        "facebook" : {
            "accessToken" : "randomtoken",
            "expiresAt" : 1477842969226,
            "id" : "randomid",
            "email" : "example@example.com",
            "name" : "Name",
            "first_name" : "Firstname",
            "last_name" : "Lastname",
            "link" : "https://www.facebook.com/...",
            "gender" : "male",
            "locale" : "en_US",
            "age_range" : {
                "min" : 21
            }
        },
        "resume" : {
            "loginTokens" : [
                {
                    "when" : ISODate("2016-08-31T15:58:00.818Z"),
                    "hashedToken" : "randomtoken"
                }
            ]
        }
    },
    "profile" : {
        "name" : "Firstname"
    }
}

但是当我这样做的时候: console.log(Meteor.user().services);

它 returns 未定义。

但是如果我这样做 console.log(Meteor.user().profile); 它会正确地带来 name

问题

如何在 meteor 中检索 facebook 信息?

默认情况下,只有用户名、电子邮件和个人资料对象会发布到客户端。您需要编写一个发布并在客户端订阅该发布以公开您需要的字段。

也就是说,直接发布 services.facebook 对象可能不适合您的目的。如果您使用多种身份验证方法,例如 Google 或 username/password,您可能希望通过将您需要的信息复制到不同的字段来标准化您的用户文档。

以下是我如何处理使用 Facebook、Google 和常规旧 email/password 的项目:

Accounts.onCreateUser(function(options, user) {
    // Copy first name and last name from user services
    if (user.services.google) {
        user.firstName = user.services.google.given_name;
        user.lastName = user.services.google.family_name;
    } else if (user.services.facebook) {
        user.firstName = user.services.facebook.first_name;
        user.lastName = user.services.facebook.last_name;
    }

    // You can use the profile object to pass in user information in a password signup form
    if (options && options.profile) {
        if (options.profile.firstName) {
            user.firstName = options.profile.firstName;
        }

        if (options.profile.lastName) {
            user.lastName = options.profile.lastName;
        }
    }

    return user;
});

Note that it is NOT recommended that you use the profile object to store user data.