大家好,
我正在使用 bcrypt模块对我的用户进行身份验证
我可以执行注册过程,但在登录过程中遇到问题
用户模型:
var userSchema = new Schema({
email: {type: String, required: true},
password: {type: String,
});
哈希方法:
userSchema.methods.encryptPassword = function (password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(5), null)
};
userSchema.methods.validPassword = function (password) {
return bcrypt.compareSync(password, this.password);
};
登录:
module.exports.login = function (user, callback) {
User.findOne({'email': user.email, 'password': user.validPassword(this.password)}, callback);
};
登录路线
router.post('/login', function (req, res) {
var user = req.body;
User.login(user, function (err, user) {
if (err) {
throw err;
}
if (!user) {
res.sendStatus(404);
return;
}
res.json(user.id);
});
});
执行时遇到此错误: TypeError:user.validPassword不是函数
请帮助。
答案 0 :(得分:0)
在登录路径中,您需要实例化架构:
router.post('/login', function (req, res) {
var user = new User(req.body);
User.login(user, function (err, user) {
if (err) {
throw err;
}
if (!user) {
res.sendStatus(404);
return;
}
res.json(user.id);
});
});
答案 1 :(得分:0)
您的错误是提供给login
方法的用户不是Mongoose数据库对象。相反,您的登录功能应如下所示:
module.exports.login = function (request, callback) {
User.findOne({'email': request.email }, function(err, user) {
if (err) return callback(err);
if(!user || !user.validPassword(request.password)) return callback();
return callback(null, user);
});
};
在您尝试验证密码之前,这将确保user
是有效的Mongoose对象。
另一种可能的解决方案是,如果您希望避免检查密码在数据层中是否有效,则只需根据其电子邮件获取用户文档,然后在登录路径中检查密码。 / p>
router.post('/login', function (req, res) {
var user = req.body;
User.findOne(user, function (err, user) {
if (err) {
throw err;
}
if (!user) {
res.sendStatus(404);
return;
}
if (!user.validPassword(req.body.password)) {
res.sendStatus(401);
return;
}
res.json(user.id);
});
});