{transaction: t}
객체를 넘겨주지 않아도 되는가 => sequelize.transaction()
을 사용하여 생성한 managed transaction에서는 명시적으로 트랜잭션 객체를 넘겨줄 필요가 없다. sequelize.transaction()
은 자체적으로 트랜잭션 객체를 생성하고, 이를 쿼리에 적용하여 트랜잭션을 관리하기 때문이다.mockRequest.body = {
title: "타이틀 실패 테스트",
content: "컨텐트 실패 테스트",
choices: [],
};
{
mockRequest.body.title = "";
expect(() =>
postWorldcupSchema
.validate(mockRequest.body)
.toThrow("월드컵 제목이 비어있습니다.")
);
}
getAll = async () => {
return await this.worldcupsModel.findAll({
include: [
{
model: Users,
attributes: [],
required: true,
},
],
attributes: [
"worldcup_id",
"user_id",
"title",
"content",
"play_count",
"likes",
[Sequelize.literal("`User`.`nickname`"), "nickname"],
"createdAt",
"updatedAt",
],
group: ["Worldcups.worldcup_id"],
order: [["createdAt", "DESC"]],
});
};
[Sequelize.literal("User.nickname"), "nickname"]
이 없이 그대로 반환하면 {User: {nickname}}
형태로 반환되기 때문에 이중 객체를 없애기 위해 literal()을 사용해주었다. 리터럴(literal) 문자열을 생성하기 위해 사용됩니다.
2) Users, Worldcups, World Tables JOIN
getOne = async (worldcup_id) => {
return await this.worldcupsModel.findOne({
include: [
{
model: Worldcup_choices,
attributes: ["choice_name", "choice_url"],
required: true,
},
{
model: Users,
attributes: [],
required: true,
},
],
attributes: [
"worldcup_id",
"user_id",
"title",
"content",
"play_count",
"likes",
[Sequelize.literal("`User`.`nickname`"), "nickname"],
"createdAt",
"updatedAt",
],
where: { worldcup_id },
});
};
해당 코드를 그대로 반환하면 choice_name과 choice_url이 담긴 object가 맨 첫번째 값만 반환되기 때문에 모든 choices objects들을 반환하려면 map으로 따로 처리를 해주어야 한다.
const worldcup_choices = worldcup.Worldcup_choices.map((choice) => ({
choice_name: choice.choice_name,
choice_url: choice.choice_url,
}));
npx sequelize db:create --env test