Search code examples
angularmeteortypescriptangular2-meteor

Exception in delivering result of invoking 'login': signup


My app is using Meteor + Angular2 (This app is based on Urigo's tutorial) (package.json at the end)

I am trying to redirect a user after he signed up. But i have this error :

Exception in delivering result of invoking 'login': signup/http://localhost:3000/app/app.js?hash=5d5262809ea4c507a654caa1a722dfd2ec17a3b9:164:21 userCallback@http://localhost:3000/packages/accounts-password.js?hash=6d4e41828e1dfcc45ff74267779a4e5ecdcd9eda:105:23

My user is successfully registered in my app and logged in, but not redirected to his profile... I tried using with and without the ngZone... I might be misunderstanding something.

This is my signup.component.ts signup code :

signup() {
if (this.signupForm.valid) {
  let user = {
    email: this.signupForm.value.email,
    password: this.signupForm.value.password,
    profile: {
      player: {
        playersName: this.signupForm.value.playersName,
        region: this.signupForm.value.region
      }
    }
  }
  Meteor.call('createUserWithRole', user, function(err, userId) {
    Meteor.loginWithPassword(user.email, user.password, function(err, success){
      this.zone.run(() => {
        if (err) {
          this.error = err;
        } else {
          this.router.navigate(['/my-profile']);
        }
      });
    });
  });
}

}

And this is my server/user/user.methods.ts

Meteor.methods({
'createUserWithRole': function(data) {
    //console.log(data);
    check(data, {
        email: String,
        password: String,
        profile: {
            player: {
                playersName: String,
                region: String
            }
        }
    });
    let userId;
    userId = Accounts.createUser({
        email: data.email,
        password: data.password,
        profile: {
            newHistory: false,
            player: {
                playerId: null,
                avatar: null,
                playerName: data.profile.player.playersName,
                playercname: data.profile.player.playersName.replace(/\s+/g, '').toLowerCase(),
                region: data.profile.player.region,
                revisionDate: null,
                lastManualUpdate: null
            }
        }
    });

    Roles.addUsersToRoles(userId, [
        'active',
        '1man_q',
        '2men_q',
        '3men_q',
        '4men_q',
        '5men_q',
        'global_chat',
        'captain',
        'report',
        'chat_global',
        'chat_lobby',
        'comment',
        'vote',
        'support',
        'default'
    ], 'user_default');
    return data;
},...others methods...skipped...

and my package.json

{
  "name": "angular2-meteor-base",
  "private": true,
  "scripts": {
    "start": "meteor --settings settings-development.json",
    "start:prod": "meteor run --production",
    "build": "meteor build ./build/",
    "clear": "meteor reset",
    "meteor:update": "meteor update --all-packages",
    "test": "meteor test --driver-package practicalmeteor:mocha",
    "test:ci": "meteor test --once --driver-package dispatch:mocha-phantomjs"
  },
  "devDependencies": {
    "@types/chai": "3.4.34",
    "@types/meteor": "^1.3.31",
    "@types/mocha": "2.2.34",
    "chai": "3.5.0",
    "chai-spies": "0.7.1",
    "meteor-node-stubs": "0.2.4"
  },
  "dependencies": {
    "@angular/common": "2.4.1",
    "@angular/compiler": "2.4.1",
    "@angular/core": "2.4.1",
    "@angular/forms": "2.4.1",
    "@angular/platform-browser": "2.4.1",
    "@angular/platform-browser-dynamic": "2.4.1",
    "@angular/router": "3.4.1",
    "angular2-meteor": "0.7.1",
    "angular2-meteor-accounts-ui": "^1.0.0",
    "angular2-meteor-polyfills": "0.1.1",
    "angular2-meteor-tests-polyfills": "0.0.2",
    "babel-runtime": "^6.18.0",
    "bootstrap": "^4.0.0-alpha.3",
    "meteor-rxjs": "0.4.7",
    "ng2-bootstrap": "^1.3.1",
    "reflect-metadata": "0.1.9",
    "rxjs": "5.0.2",
    "zone.js": "0.7.4"
  }
}

Solution

  • You need to bind your function to the current environnent.

      Meteor.call('createUserWithRole', user, function(err, userId) {
                    Meteor.loginWithPassword(user.email, user.password, function(err, success) {
                        this.zone.run(function(){
                            if (err) {
                                this.error = err;
                            } else {
                                this.router.navigate(['/my-profile']);
                            }
                        }.bind(this));
                    }.bind(this));
                }.bind(this));