gpt4 book ai didi

javascript - express , Passport : can't set headers after they are sent

转载 作者:行者123 更新时间:2023-11-30 16:21:40 25 4
gpt4 key购买 nike

我仍然是 node 和 webdev 的菜鸟,但正在努力!
我收到此错误:发送后无法设置 header

在平均堆栈上使用 passport.js 和 bcryptjs 比较方法进行密码验证时使用以下方法

routes/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);
});

}));

这会正确验证有效的用户名和密码,并登录。

对于无效的用户名,它会正确地拒绝登录尝试。

但是对于无效的密码,它会登录,然后使应用程序崩溃并出现无法设置 header 错误。

但是,如果我将 bcrypt.compare 更改为 bcrypt.compareSync,则所有验证都是正确的。

if (!bcrypt.compareSync(password, user.password)) {
return done(null, false, {
message: {
password: 'Incorrect password'
}
});
}

我宁愿不依赖于同步方法,所以请帮助我理解我哪里出错了!

最佳答案

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)
})

关于javascript - express , Passport : can't set headers after they are sent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34645284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com