0

皆さん、

私は助けが必要です。私はしばらくの間これに取り組んできましたが、それを理解できないようです。シンプルにする必要があります。私は aldeed collection2 を使用していますが、ユーザー アカウントの作成メソッドによってスローされた過去の検証エラーを取得できないようです。私のスキーマは非常に標準的で、 meteor.users コレクションに添付されています。

Schema={}
//SimpleSchema.debug = true;


Schema.UserProfile = new SimpleSchema({

  picture: {
    type: String,
    optional: true
  },
  updatedAt: {
    type: Date,
    autoValue: function() {
      if (this.isUpdate) {
        return new Date();
      }
    },
    denyInsert: true,
    optional: true
  },
  roles: {
    type: String,
    optional: true
  }
});

Schema.User = new SimpleSchema({
  _id: {
    type: String,
    regEx: SimpleSchema.RegEx.Id,
    optional: true,
    denyUpdate: true
  },

  emails: {
    type: [Object],
    optional: true
  },
  "emails.$.address": {
    type: String,
    regEx: SimpleSchema.RegEx.Email,
    label: ""

  },
  "emails.$.verified": {
    type: Boolean,
    optional: true
  },
  createdAt: {
    optional: true,
    type: Date,
    autoValue: function() {
      if (this.isInsert) {
        return new Date;
      } else if (this.isUpsert) {
        return {$setOnInsert: new Date};
      } else {
        this.unset();
      }
    }
  },
  profile: {
    type: Schema.UserProfile,
    optional: true
  },
  services: {
    type: Object,
    optional: true,
    blackbox: true
  },

  // Option 2: [String] type
  // If you are sure you will never need to use role groups, then
  // you can specify [String] as the type
  roles: {
    type: [String],
    optional: true,
    autoValue: function() {
      if (this.isInsert) {
        return ['user'];
      } else if (this.isUpsert) {
        return {$setOnInsert: ['user']};
      } else {
        this.unset();
      }
    }
  },

  password: {
    type: String,
    label: "Password",
    min: 6
  }

});

/* Attach schema to Meteor.users collection */
Meteor.users.attachSchema(Schema.User);

サーバーでユーザーを作成する方法は次のとおりです。

Accounts.config({
  forbidClientAccountCreation : true
});

//creates user on server
Meteor.methods({
  createNewUserAccount: function(userdata) {
    var userId;
    check(userdata, Schema.User);
    //console.log(userdata);

    userId = Accounts.createUser({
      email: userdata.emails[0].address,
      password: userdata.password,
      profile: userdata.profile
    });
    //console.log(userId);
    return userId;
  }
});

Accounts.onCreateUser(function(options, userdata) {
  //user.profile = {};
  // we wait for Meteor to create the user before sending an email
  //need to address the exception when existing email is tried for signing up
  Meteor.setTimeout(function () {
    Accounts.sendVerificationEmail(userdata._id);
  }, 2 * 1000);
return userdata;
});

私のクライアントには、次のsignup.jsがあります

Template.signup.events({
  'submit form': function(e){
    // Prevent form from submitting.
    e.preventDefault();
    //console.log(doc);
    user = {
      'email.$.address': $('[name="emails.0.address"]').val(),
      password: $('[name="password"]').val()
    };

    Meteor.call('createNewUserAccount', user, function(error) {
      if (error) {
        return alert(error.reason);
      } else {
        Router.go('/');
      }
    });

  }

私が間違っていることを誰かが知っていますか?スキーマは電子メール アドレスを検証しません。次のエラーが表示されます: email.0.address is not allowed by the schema.

4

1 に答える 1

1

オブジェクトを作成しています:

user = {
  'email.$.address': $('[name="emails.0.address"]').val(),
  password: $('[name="password"]').val()
};

キーはリテラル文字列です'email.$.address'

だからあなたがするとき:

    userId = Accounts.createUser({
      email: userdata.emails[0].address,
      password: userdata.password,
      profile: userdata.profile
    });

鍵がないため、鍵emailが見つかりません。代わりに、キーは. また、スキーマには というキーがありません。と呼ばれるものがありますuserdata.emails[0]emails'email.$.address'email.$.addressemails.$.address

試す:

Template.signup.events({
  'submit form': function(e){
    // Prevent form from submitting.
    e.preventDefault();
    //console.log(doc);
    user = {
      'emails.$.address': $('[name="emails.0.address"]').val(),
      password: $('[name="password"]').val()
    };

    Meteor.call('createNewUserAccount', user, function(error) {
      if (error) {
        return alert(error.reason);
      } else {
        Router.go('/');
      }
    });

  }

それで

//creates user on server
Meteor.methods({
  createNewUserAccount: function(userdata) {
    var userId;
    check(userdata, Schema.User);
    //console.log(userdata);

    userId = Accounts.createUser({
      email: userdata['emails.$.address'],
      password: userdata.password,
      profile: userdata.profile
    });
    //console.log(userId);
    return userId;
  }
});
于 2015-06-19T20:44:30.917 に答える