node로 카카오 로그인을 구현하던 중 아래와 같은 오류가 발생했다.
[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
[ERR_HTTP_HEADERS_SENT]는 서버가 클라이언트에 둘 이상의 응답을 보내려고 할때 발생하는 오류입니다.
async (accessToken, refreshToken, profile, done) => {
console.log("profile", profile);
try {
const user = await User.findOne({
where: { snsId: profile.id, provider: "kakao" },
});
if (user) {
done(null, user);
} else {
const newUser = await User.create({
email: profile._json?.kakao_account?.email,
nick: profile.displayName,
snsId: profile.id,
provider: "kakao",
});
done(null, newUser);
}
} catch (error) {
console.error(error);
done(error);
}
done();
}
위 코드에서 user가 있다면 로그인을 하게되고 만약 user가 없다면 새로운 유저를 생성한 다음 로그인을 하게된다. 하지만 여기서 로그인을 하였는데 밑에 있는 done()이 또 응답을 보내려고 하기때문에 오류가 발생하는 것이다.
async (accessToken, refreshToken, profile, done) => {
console.log("profile", profile);
try {
const user = await User.findOne({
where: { snsId: profile.id, provider: "kakao" },
});
if (user) {
done(null, user);
} else {
const newUser = await User.create({
email: profile._json?.kakao_account?.email,
nick: profile.displayName,
snsId: profile.id,
provider: "kakao",
});
done(null, newUser);
}
} catch (error) {
console.error(error);
done(error);
}
}
둘 이상의 응답을 없애주고 하나만 하게 만들었더니 오류를 해결 할 수 있었다.