Día de Ruru
20230414 TIL 본문
문제점 1. 권한이 일치하지 않는 게시글이 조회되는 에러 발생
분명 어제까지 잘되던 기능이 리펙토링 이후에 묘하게 이상해졌다..
내가 언급된 일정만 따로 조회하는 API에서 조회는 잘 되는데 내가 권한이 있는 mentionId가 아니라 같은 일정이긴 하지만 권한이 다른 팀원에게 있는 mentionId 를 가져오는 경우가 생겼다.. 뭔가 찾아오는 부분에서 findOne을 할 때 내가 원하는 데이터가 아니라 가장 앞에 있는 데이터를 가져오는 것 같다.
해결방안 1
아래의 코드가 내가 처음 작성한 코드이다. 테이블 조회를 애초에 schedules 테이블을 기준으로 했기 때문에 관계성이 연결되어있지 않은 mention 테이블은 따로 조회한 후 assign() 메서드를 활용해서 하나의 객체로 합쳐버렸다...
const schedule = await Schedules.findOne({
raw: true,
where: { eventId },
attributes: [
//불러올 요소들
],
include: [
{
model: Users,
attributes: [],
},
{
model: Events,
attributes: [],
},
],
});
const mention = await Mentions.findOne({
raw: true,
where: { eventId, userId },
attributes: [필요한 요소들],
});
return Object.assign({}, schedule, mention); //두개의 배열을 하나로 합치는 메서드
위의 코드를 리펙토링 한 코드가 아래의 코드이다!! Events를 기준으로 테이블 조회를 했더니 각각 연결되어 있던 Users, Schedules, Mentions 테이블을 하나로 조인할 수 있었다. 하지만 이렇게 코드를 작성한 이후로 문제가 생겼다...
const schedule = await Events.findOne({
raw:true,
where:{eventId},
attributes:[
//필요한 요소들
],
include : [
{
model : Users,
attributes : []
},
{
model : Schedules,
attributes : []
},
{
model : Mentions,
attributes : [],
}
]
})
열심히 콘솔도 찍어보고 디버깅을 해본 결과 Mentions에 있던 필터링 조건중 하나인 userId에 대한 필터링이 없어서 원하는 데이터의 eventId가 같은 것들 중에서 가장 앞에 있는 데이터를 반환하는 것이었다.
const schedule = await Events.findOne({
raw:true,
where:{eventId},
attributes:[
//필요한 요소들
],
include : [
{
model : Users,
attributes : []
},
{
model : Schedules,
attributes : []
},
{
model : Mentions,
attributes : [],
where : {userId}
}
]
})
include 된 테이블 중 Mations 테이블의 필터링 조건을 추가해주었더니 정상적으로 작동했다!!
문제점 2. 회원가입 시 소문자와 대문자를 같은 글자로 인식하는 버그 발생
회원가입 시 aaa123이라는 아이디로 회원가입을 하면 다른 사람이 AAA123이라는 아이디로 회원가입을 하려고 할 때 같은 아이디로 인식하게 되서 에러가 반환된다.
해결방안 2
1. 중복 검사 시
중복 검사를 할 때에는 데이터베이스에 있는 값들의 대소문자를 구분해서 찾아오겠다는 쿼리문을 작성해주면 된다.
const user = await sequelize.query(
"SELECT * FROM Companys WHERE BINARY companyId = ? LIMIT 1",
{
replacements: [companyId],
type: sequelize.QueryTypes.SELECT,
}
);
위의 코드에 있는"SELECT * FROM Companys WHERE BINARY companyId = ? LIMIT 1"은 Companys 테이블에서 companyId 가 아래의 replacements 에 있는 값인 것들을 대소문자를 구분해서 하나만 가져오라는 뜻이다. type에는 어떤 쿼리 타입으로 작성하는지 알려주면 된다. 나는 조회만 하면되기 때문에 SELECT라고 써주면 된다.
2. 데이터를 테이블에 입력할 시
중복 검사를 마친다고해도 데이터테이블내에서 중복된 데이터라고 인식해버려서 롤백이되어버렸다. 이 경우 모델에서 대소문자 구분하는 옵션을 추가로 작성해주면 된다!
userId: {
allowNull: false,
primaryKey: true,
type: DataTypes.STRING.BINARY,
collate: 'utf8_bin'
},
'항해99 > TIL' 카테고리의 다른 글
20230419 TIL (0) | 2023.04.20 |
---|---|
20230418 TIL (1) | 2023.04.19 |
20230413 TIL (0) | 2023.04.13 |
20230411 TIL (0) | 2023.04.12 |
20230410 TIL (0) | 2023.04.11 |