将标头发送到客户端后无法设置标头.重新生成会话时出错



我面对的是"在将报头发送到客户端之后不能设置报头";Express/Passportjs中存在错误。我知道这个错误主要发生在回调调用了两次或两次以上时;,但我不明白为什么会发生这个错误。我在底部指定了错误案例。

这是我在app.js中为策略设置编写的代码

passport.use(new KakaoStrategy(
{
clientID: kakao_key,
callbackURL: '/userSchemaAPI/login/kakao/callback',
},
async (accessToken, refreshToken, profile, done) => {
try {
const foundUser = await User.findOne(
{
snsId: profile.id,
provider: 'kakao',
},
);
if (foundUser) {
return done(null, foundUser);
}
else{
return done(null, false, profile);
} 
} catch (error) {
return done(error);
}
},
),

);

这是路由器代码

router.get('/login/kakao', passport.authenticate('kakao'));
router.get('/login/kakao/callback', (req, res, next) => {
passport.authenticate('kakao', function (err, user, info){
if (err) {
return next(err);
}
if (!user) { 
const { id } = info;
req.session.joinUser = {
snsId: id,
email: info._json.kakao_account.email,
username: info._json.properties.nickname,
};
return req.session.save(() => {
res.redirect('/userSchemaAPI/register/kakao');
});
}
return req.login(user, function (error){
if (error) {
return next(error);
}
return res.redirect('/');
});
})(req, res, next);
});

当用户还没有在我们的数据库中注册时,我会尝试注册新用户。这是POST请求调用路由"/userSchemaAPI/register/kakao"时的代码-

module.exports.createNewKakaoUser = async(req,res,next)=>{
try {
const { snsId, username, email } = req.session.joinUser;  
const user = await User.create({
provider : 'kakao',
snsId : snsId,
email: email,
username: req.body.username || username,
});
req.session.regenerate(() => { 
req.login(user, (error) => { 
if (error) {
return next(error);
}
return res.redirect('/');
});
});
} catch (error) {
console.error(error);
next(error);
}

}

我目前面临两个主要错误。

  1. 当我的信息已经在数据库中时,我无法直接登录。

  2. 我成功地在数据库中注册了我的信息,但服务器生成了一个";在将报头发送到客户端之后不能设置报头";登录时出错。

如果您不返回,您的代码将在下一次处理后继续

req.session.regenerate(() => { 
req.login(user, (error) => { 
if (error) {
return next(error);
}
return res.redirect('/');
});
});

最新更新