我在 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);
}
}
我目前面臨兩個主要錯誤。
當我的資訊已經在資料庫中時,我無法直接登錄。
我成功在 DB 中注冊了我的資訊,但服務器在登錄時出現“無法在將標頭發送到客戶端后設定標頭”錯誤。
uj5u.com熱心網友回復:
如果您不回傳,您的代碼將在處理下一個后繼續
req.session.regenerate(() => {
req.login(user, (error) => {
if (error) {
return next(error);
}
return res.redirect('/');
});
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512123.html
上一篇:如何使用Terraform將用戶分配的標識添加到AzureSynapse作業區?
下一篇:Blazor會話存盤
