使用带有 Mongoose 的 MEAN 堆栈(MongoDB、ExpressJS、AngularJS 和 NodeJS),我正在设置一个简单的注册表单,其中包括电子邮件地址和密码字段等。我包括一个密码确认字段,以确保用户在完成注册之前知道他们输入了什么。很典型。
但是,如果模型中未包含已发布的表单变量,我无法弄清楚如何访问它们。我不想将密码确认字段的数据写入数据库,只是用于验证。我毫不怀疑这是一个微不足道的问题,但我通过搜索找到的所有内容都使用了架构中包含的字段,我已经掌握了这些字段。
我假设我需要编写一个模式方法,也许是一个虚拟方法,但是我如何获得 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);