moni
moni

Reputation: 201

Meteor onCreateUser issue

I am using Meteor and people can connect to the site via Facebook. I'm using people username to identify them. But, some of them don't have a username. For example, a new user has null as a username. What I'm trying to do is, if the person has a username then OK we use their username. If not, I wanna use their Facebook id as their username. The problem is, my if condition is not working properly. If the person has a username, the if condition considers that the person doesn't. The weird thing is, if I do a console.log of the username before the if condition, it will show the username. But once in the if, it considers that the username is null. Here is the code :

Accounts.onCreateUser(function(options, user) {
  var fb = user.services.facebook;
  var token = user.services.facebook.accessToken;

    if (options.profile) { 

        options.profile.fb_id = fb.id;
        options.profile.gender = fb.gender;
        options.profile.username = fb.username    

        console.log( 'username : ' + options.profile.username); 


        if ( !(options.profile.username === null || options.profile.username ==="null" || options.profile.username === undefined || options.profile.username === "undefined")) {
          console.log('noooooooo');
          options.profile.username = fb.id; 
        } else {
          console.log('yessssssss');
          options.profile.username = fb.username;
        }

        options.profile.email = fb.email; 
        options.profile.firstname = fb.first_name;

        user.profile = options.profile;     
    }


    sendWelcomeEmail(options.profile.name, options.profile.email); 
    return user;
}); 

With this code, if I log in with my Facebook that has a username. The condition will show 'noooooooo' but the console.log( 'username : ' + options.profile.username); will show my username. Why does it do that? :l

Upvotes: 2

Views: 1044

Answers (1)

Jan Rudovsky
Jan Rudovsky

Reputation: 186

It's because creating is called before logging and logging is asynchronous .. so you cannot ensure that your if will be or will not true/false. Your putting information from fb service is redundant, because all these informations are already saved with user.

http://docs.meteor.com/#meteor_user

You should obtain information about user after he is loggedIn because in that moment you will be able to recognise what kind of identifier you can use username/id.

//Server side
Meteor.publish("userData", function () {
    return Meteor.users.find({_id: this.userId});

    // You can publish only facebook id..
    /*return Meteor.users.find({_id: this.userId},
        {
            fields: {
                'services.facebook.id': true
            }
        }
    );*/
});

//Client side
Meteor.subscribe("userData");

// .. you can see more informations about logged user
console.log(Meteor.users.find({}).fetch());

Upvotes: 2

Related Questions