我仍然是节点和webdev的菜鸟,但努力尝试! 我收到此错误:发送后无法设置标头
使用passport.js和bcryptjs比较方法在平均堆栈上进行密码验证时使用以下内容
路由/ login.js
var express = require('express')
var router = express.Router()
var mongoose = require('mongoose')
var User = mongoose.model('User')
var passport = require('passport')
router.post('/', function (req, res, next){
passport.authenticate('local', function(err, user, info){
if(err){ return next(err); }
if(user){
return res.json({token: user.generateJWT()});
} else {
return res.status(401).send(info)
}
})(req, res, next);
});
module.exports = router
authenticate / local.js
var passport = require('passport')
var LocalStrategy = require('passport-local').Strategy
var mongoose = require('mongoose')
var User = mongoose.model('User')
var bcrypt = require('bcryptjs')
passport.use(new LocalStrategy(function(username, password, done) {
User.findOne({
username: username
}, function(err, user) {
if (err) {
return done(err)
}
if (!user) {
return done(null, false, {
message: {
username: 'Incorrect username.'
}
})
}
bcrypt.compare(password, user.password, function(err, isMatch) {
if (err) {
return done(err)
}
if (!isMatch) {
return done(null, false, {
message: {
password: 'Incorrect password'
}
})
}
});
return done(null, user);
});
}));
这样可以正确验证有效的用户名和密码,并登录。
对于无效的用户名,它会正确拒绝登录尝试。
但是对于无效的密码,它会登录然后使用“无法设置标头”错误导致应用崩溃。
但是,如果我将 bcrypt.compare 更改为 bcrypt.compareSync ,则所有验证都是正确的。
if (!bcrypt.compareSync(password, user.password)) {
return done(null, false, {
message: {
password: 'Incorrect password'
}
});
}
我宁愿不依赖同步方法,所以请帮助我理解我哪里出错了!
答案 0 :(得分:2)
bcrypt.compare()
是异步的,但您立即呼叫done(null, user)
。在回调中移动它应该没问题:
bcrypt.compare(password, user.password, function(err, isMatch) {
if (err) { return done(err) }
if (!isMatch) {
return done(null, false, { message: { password: 'Incorrect password' } })
}
done(null, user)
})