我想在创建用户时哈希用户密码。用户已创建,但密码未经过哈希处理我不明白为什么..这是我的代码:
var mongoose = require('mongoose');
var jwt = require('jsonwebtoken');
var User = mongoose.model('User');
var config = require('../../config/config');
var bcrypt = require('bcrypt');
var SALT_WORK_FACTOR = 10;
exports.create_a_user = function(req, res) {
var user = new User(req.body);
user.schema.pre('save', function(next){
var user = this;
if (!user.isModified('password')) return next();
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt){
if(err) return next(err);
bcrypt.hash(user.password, salt, function(err, hash){
if(err) return next(err);
user.password = hash;
next();
});
});
});
user.save(function(err, user) {
if (err){
res.send(err);
}
res.json(user);
});
};
这是我的用户模型:
module.exports = mongoose.model('User', new Schema({
lastname: {
type: String,
validate: {
validator: function(v) {
return /^([a-zA-ZàáâäæçéèêëîïôœùûüÿÀÂÄÆÇÉÈÊËÎÏÔŒÙÛÜŸ \-\']+)$/.test(v);
},
message: 'Le champ {PATH} ne doit pas contenir de caractères spéciaux ou de chiffres !'
},
required: [true, "Le champ nom de famille est requis"]
},
firstname: {
type: String,
validate: {
validator: function(v) {
return /^([a-zA-ZàáâäæçéèêëîïôœùûüÿÀÂÄÆÇÉÈÊËÎÏÔŒÙÛÜŸ \-\']+)$/.test(v);
},
message: 'Le champ {PATH} ne doit pas contenir de caractères spéciaux ou de chiffres !'
},
required: [true, "Le champ prénom est requis"]
},
mail: {
type: String,
validate: {
validator: function(v) {
return /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/.test(v);
},
message: '{VALUE} n\'est pas une adresse mail valide!'
},
required: [true, "L'email est requis"]
},
password: {
type: String,
required: [true, "Le mot de passe est requis"]
},
phone: {
type: String,
validate: {
validator: function(v) {
return /^0[0-9]([-. ]?\d{2}){4}[-. ]?$/.test(v);
},
message: '{VALUE} n\'est pas un numéro de téléphone valide!'
},
required: [true, 'Le numéro de téléphone est requis']
},
}));
我的表格:
<form method="post" action="/api/v1/user/register">
<input type="text" name="lastname" placeholder="lastname"><br>
<input type="text" name="firstname" placeholder="firstname"><br>
<input type="text" name="adress" placeholder="adress"><br>
<input type="text" name="mail" placeholder="mail"><br>
<input type="password" name="password" placeholder="password"><br>
<input type="text" name="phone" placeholder="phone"><br>
<input type="date" name="birthdate" placeholder="birthdate"><br>
<input type="submit" value="Connection">
我经历了很多不同的网站,方法总是一样的。此外,它不识别“.pre()”函数而没有.schema之前然后创建用户工作,但没有任何哈希密码。有人有什么想法吗?
答案 0 :(得分:1)
在导出模型之前,应在架构上设置预保存挂钩。
用户模型:
var UserSchema = new Schema({
...
})
UserSchema.pre('save', function(next) {
var user = this
if (!user.isModified('password')) return next()
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
if (err) return next(err)
bcrypt.hash(user.password, salt, function(err, hash) {
if(err) return next(err)
user.password = hash
next()
})
})
})
module.exports = mongoose.model('User', UserSchema)