sequelize associate 문제
- m to n 일 때 belongstomany가 안되어서 hasmany와 belongsto, 즉 1:n 관계를 두번 사용하여 m to n을 만들었다
query type 문제
const query = {
attributes: [["uid", "id"], "image", "location", "sex", "age"],"info"],
where: { uid },
};
return await Users.findOne(query as object);
- 타입스크립트에서 위와 같이 사용시 query에서 type 문제가 발생하였다.
- 평소에는 발생하지 않았으나 attributes처럼 alias를 위한 이중 배열을 사용 시 발생하였다.
- type assertion을 사용하여 해결
- type assertion은 런타임에 동작을 예상하는 형변환(casting)과는 다르게 순수하게 컴파일 시간에 코드가 어떻게 분석될지 말해주는 방법
- 남발하여 사용하면 해롭지만 정확히 알고 사용하면 사용자에게 명확한 타입을 제시해줄 수 있다.
const query = {
attributes: [["uid", "id"], "image", "location", "sex", "age"],
where: { gid },
};
const memberData = await Users.findAll(query as object);
const memberData = await Users.findAll({
attributes: [["uid", "id"], "image", "location", "sex", "age"],
where: { gid },
});
sequelize query로 꺼내온 값들
- sequelize의 findOne 이나 findAll로 가져온 데이터는 객체 형태가 아니라 여러 프로퍼티로 이루어져 있다
- 그 중 대부분은 dataValues라는 프로퍼티의 값을 사용한다.
- dataValues라는 값은 아래와 같이 사용할 수 없다.
const teamInfo = await Team.findOne(query);
const gid = teamInfo.dataValues.id;
teamInfo["dataValues"]
sequelize alias
- associate할때 as를 사용하여 alias를 지정하면 직접 쿼리를 사용할 때, 해당 이름으로 쿼리를 작성할 수 있다.
- 이렇게 변경된 이름은 API로 JSON 형식으로 보낼 때 유용하게 사용할 수 있다.
Sequelize include 사용시 타입 문제
- model에서 정의할 때 associations를 사용해 미리 include시 생기는 타입을 정의할 수 있음