1

Mongoose で MEAN スタック (MongoDB、ExpressJS、AngularJS、および NodeJS) を使用して、メール アドレスやパスワード フィールドなどを含む単純な登録フォームを設定しています。ユーザーが登録を完了する前に何を入力したかがわかるように、パスワード確認フィールドを含めています。かなり典型的です。

ただし、スキーマに含まれていない場合、モデルで投稿されたフォーム変数にアクセスする方法がわかりません。パスワード確認フィールドのデータをDBに書き込みたくありません。検証に使用するだけです。些細な問題であることは間違いありませんが、検索で見つかったものはすべて、スキーマに含まれるフィールドを使用しており、これを処理しています。

スキーマ メソッドを作成する必要があると思いますが、おそらく仮想メソッドを作成する必要がありますが、confirmPassword フィールドの値を取得するにはどうすればよいでしょうか? あなたよりも頭のいい人が本当に私を正しい方向に向けてくれるなら、私はとても助かります. これが私がこれまでに持っているものです(注:簡潔にするために、他のコントローラーメソッド、依存関係の宣言などを省略しました):

signup.jade (フォーム)

  form.signup(action="/users", method="post")

    .control-group
      label.control-label(for='email') Email
      .controls
        input#email(type='text', name="email", placeholder='Email', value=user.email)

    .control-group
      label.control-label(for='password') Password
      .controls
        input#password(type='password', name="password", placeholder='Password')

    .control-group
      label.control-label(for='confirmPassword') Confirm Password
      .controls
        input#password(type='password', name="confirmPassword", placeholder='Confirm Password')

    //- Birthdate
    include ../shared/birthdate

    .form-actions
      button.btn.btn-primary(type='submit') Sign Up
       
      | or 
      a.show-login(href="/login") Log In

users.js (コントローラー)

/**
 * Create user
 */
exports.create = function(req, res) {
  var user = new User(req.body);

  user.provider = 'local';
  user.save(function(err) {
    if (err) {
      return res.render('users/signup', {
        errors: err.errors,
        user: user
      });
    }
    req.logIn(user, function(err) {
      if (err) return next(err);
      return res.redirect('/');
    });
  });
};

user.js (モデル)

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
  Schema = mongoose.Schema,
  crypto = require('crypto'),
  _ = require('underscore');

/**
 * User Schema
 */
var UserSchema = new Schema({
  email: String,
  hashed_password: String,
  salt: String
});

/**
 * Virtuals
 */
UserSchema.virtual('password').set(function(password) {
  this._password = password;
  this.salt = this.makeSalt();
  this.hashed_password = this.encryptPassword(password);
}).get(function() {
  return this._password;
});

/**
 * Validations
 */
var validatePresenceOf = function(value) {
  return value && value.length;
};

// the below validations only apply if you are signing up traditionally (e.g. not fb, etc)
UserSchema.path('email').validate(function(email) {
  return email.length;
}, 'Email cannot be blank');

UserSchema.path('hashed_password').validate(function(hashed_password) {
  return hashed_password.length;
}, 'Password cannot be blank');


/**
 * Pre-save hook
 */
UserSchema.pre('save', function(next) {
  if (!this.isNew) return next();

  if (!validatePresenceOf(this.password))
    next(new Error('Invalid password'));
  else
    next();
});

/**
 * Methods
 */
UserSchema.methods = {
  /**
   * Authenticate - check if the passwords are the same
   *
   * @param {String} plainText
   * @return {Boolean}
   * @api public
   */
  authenticate: function(plainText) {
    return this.encryptPassword(plainText) === this.hashed_password;
  },

  /**
   * Make salt
   *
   * @return {String}
   * @api public
   */
  makeSalt: function() {
    return Math.round((new Date().valueOf() * Math.random())) + '';
  },

  /**
   * Encrypt password
   *
   * @param {String} password
   * @return {String}
   * @api public
   */
  encryptPassword: function(password) {
    if (!password) return '';
    return crypto.createHmac('sha1', this.salt).update(password).digest('hex');
  }
};

mongoose.model('User', UserSchema);
4

1 に答える 1