지난번 Credentials에 이어 Supabase와 연동하여 로그인을 진행하는 과정에서 에러가 발생하였고,
이 에러를 해결한 방법을 소개하고자 한다.
우선 코드 먼저 살펴보자
async authorize(credentials, req) {
if(!credentials) {
throw new Error('입력 값이 잘못되었습니다.')
}
// supabase에서 데이터 가져와서 객체를 만든 후 return
const repositoryEmail = await supabase.from('company_user').select('email, name ').eq('email', `${credentials?.email}`);
const email = repositoryEmail.data
console.log(email);
return email;
},
우선 에러가 발생한 코드의 이유로는 데이터 타입의 문제였다.
authroize
함수에서 return 하는 데이터는 객체여야 하는데 supabase의 data는 배열로 들어오기 때문에 또 따로 가공을 해 주어야 한다.
async authorize(credentials, req) {
if (!credentials) {
throw new Error('입력 값이 잘못되었습니다.');
}
// supabase에서 데이터 가져와서 객체를 만든 후 return
const repositoryEmail = await supabase
.from('company_user')
.select('email, name ')
.eq('email', `${credentials?.email}`);
// 추가 된 부분
const email = JSON.stringify(repositoryEmail.data?.[0]);
console.log(email);
if (email) {
return {
id: email,
email: email,
name: this.name,
};
}
return null;
},
email을 가져올때 배열 안의 데이터가 [ { email: 'test@test.com', name: 'name'}]
이런식으로 가져와지기 때문에 0번째 인덱스를 사용하였다.
2024 / 01 / 15 추가사항
.single()
메서드로 데이터를 가져오게되면 인덱스를 사용하지 않아도 된다.
email, name 등등 필요한 정보를 supabase single 쿼리로 가져올 수 있지만 그렇게하면 코드가 너무 길어져 가독성이 떨어질 거 같아 이 방법을 사용하였다.
async authorize(credentials, req) {
if (!credentials) {
throw new Error('입력 값이 잘못되었습니다.');
}
// supabase에서 데이터 가져와서 객체를 만든 후 return
const companyUser = await supabase
.from('company_user')
.select('*')
.eq('email', `${credentials?.email}`);
const userData = companyUser.data?.[0];
if (userData?.password !== credentials?.password) {
throw new Error('비밀번호가 다릅니다.');
}
return {
id: userData.id,
email: userData.email,
name: userData.name,
image: null,
};
},
id를 넣어주지 않으면 다시 타입에러가 발생하므로 id 값은 필수적으로 넣어주어야 한다.