为了账号安全,请及时绑定邮箱和手机立即绑定

一直报Password is not matched,密码对比出错

UserSchema.methods = {
    comparePassword: function(_password,cb) {
		var password = this.password
        bcrypt.compare(_password,password,function(err,isMatch){
			if(err) return cb(err);
			
			cb(null,isMatch)
		})
    }
}

一直提示密码不对,后来发现在bcrypt.compare中根本就获取不到this,需要先把this赋予一个变量再传进来(如上面代码)。

因为下载不到bcrypt,所以用的bcryptjs。不太清楚是哪里出错才会导致这个问题。代码和教程基本一样的。

有同样问题的可以参考一下,知道问题原因的,还请仔细说说。

正在回答

9 回答

感谢分享~

另外,

只有在删除next()之后所注册的用户名和密码才能被正确比值,之前的录入的用户名和密码仍不可用

0 回复 有任何疑惑可以回复我~

我的老是说Incorrect arguments,不知道为什么

0 回复 有任何疑惑可以回复我~

楼主,我根据老师代码写没出现错误。前面跟视频不一样的只有在app.js的signup那把find改成findOne。

//signup
app.post('/user/signup',function(req,res){
    var _user = req.body.user
    //req.param('user') 作用上同  是express内部的一个实现 不推荐使用 获取数据有三种方式 query params body param()获取的顺序优先级从高到底:params>body>query
   

    User.findOne({name:_user.name},function(err,user){
        if (err) {
            console.log(err)
        }
        
        if(user){
            return res.redirect('/')
        }
        else{


0 回复 有任何疑惑可以回复我~

我也有这个问题啊,请问楼主怎么解决的呀

0 回复 有任何疑惑可以回复我~
#1

纯洁的豆芽 提问者

仔细看一下我的内容,我在问题里就已经把解决方法写出来了,用个变量保存下this或者this.password。至于错误的原因下面也有人回答了,至于对不对,还没去验证,参考一下吧。
2017-02-15 回复 有任何疑惑可以回复我~

http://img1.sycdn.imooc.com//57f4c3fc000117d801830050.jpg

用命令行输出,_password是可以获取到的,但是当前的this.password一直获取不到

0 回复 有任何疑惑可以回复我~

找到原因了,schemas/user.js 里面多了一个next(),会出现获取不到this以及比对失败。主要就是加盐失败了。核对文件里这段代码是否一致:

UserSchema.pre('save',function(next){
	var user = this;
	if(this.isNew){
		this.meta.createAt = this.meta.updateAt = Date.now();
	}
	else{
		this.meta.updateAt = Date.now();
	}

	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();
		})
	})
	
	// next();  教程里多出来的
})


1 回复 有任何疑惑可以回复我~
#1

nc1199

这个是正解,在注册时对密码加盐就失败了,所以登录时才会出现错误
2017-12-28 回复 有任何疑惑可以回复我~

同问代码一样和教程一样,为什么获取不到this,以及比对出错?

0 回复 有任何疑惑可以回复我~

可以先var user=this,好像上一节老师那样

0 回复 有任何疑惑可以回复我~

bcrypt.compare(_password, user.password, function(err, isMatch) {

   if (err){

   console.log(err);

   return cb(err)

   }


   //console.log(_password+user.password);

   //cb(null, isMatch)

   //上面代码出错,始终验证密码错误,自己修正如下

   if(_password==user.password){

   return cb(null,true);

}else{

   return cb(null,false);

   }

})


1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
node建站攻略(二期)——网站升级
  • 参与学习       51960    人
  • 解答问题       408    个

帮助你深入前后端开发留下的迷惑,为进一步自学打下基础

进入课程

一直报Password is not matched,密码对比出错

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信