◻️ 게시글 좋아요 누르기 및 좋아요 취소하기
유저 모델과 포스트 모델 다대다 관계 지정 후 테이블 생성
models/user.js
db.User.belongsToMany(db.Post, {
foreignKey: 'UsersId',
as: 'Liked',
through: 'PostLike'
models/ post.js
db.Post.belongsToMany(db.User, {
as: 'Liker',
through: 'PostLike',
})
브라우저에 해당 유저가 좋아요 누른 게시글을 include(join)를 통해 해당 유저 정보를 넘겨줌
router.get('/', async (req, res, next) => {
try {
const posts = await Post.findAll({
include: [{
model: User,
attributes: ['id', 'nick'],
},
{
model: User,
attributes: ['id', 'nick'],
as: 'Liker',
through: 'PostLike'
},
],
order: [['createdAt', 'DESC']],
});
// console.log(posts)
res.render('main', {
title: 'NodeBird',
twits: posts,
// user: req.user,
});
} catch (err) {
console.error(err);
next(err);
}
});
passport 유저 복구 시 해당 id가 User 정보에 어떤 게시글에 좋아요를 눌렀는지 정보 추가
passport/index.js
passport.deserializeUser((id, done) => {
User.findOne({ where: { id : id },
include : [{
model: User,
attributes: ['id', 'nick'],
// 구분하기 위해 as 써줌
as: 'Followings',
through: 'Follow'
}, {
model: User,
attributes: ['id', 'nick'],
as: 'Followers',
through: 'Follow'
},
{
model: User,
attributes: ['id'],
as: 'Liked',
through: 'PostLike'
}
]
})
.then(user => {
console.log(user)
return done(null, user)
})
// 이후 해당 유저는 req.user라는 속성으로 접근 가능하게 됨
// 또한 로그인이 되어있다면 req.isAuthenticated() 값이 true
.catch(err => done(err))
});
local();
kakao();
}
passport/index.js
passport.deserializeUser((id, done) => {
User.findOne({ where: { id : id },
include : [{
model: User,
attributes: ['id', 'nick'],
// 구분하기 위해 as 써줌
as: 'Followings',
through: 'Follow'
}, {
model: User,
attributes: ['id', 'nick'],
as: 'Followers',
through: 'Follow'
},
{
model: Post,
attributes: ['id'],
as: 'Liked',
through: 'PostLike'
}
]
})
.then(user => {
console.log(user)
return done(null, user)
})
// 이후 해당 유저는 req.user라는 속성으로 접근 가능하게 됨
// 또한 로그인이 되어있다면 req.isAuthenticated() 값이 true
.catch(err => done(err))
});
db.User.belongsToMany(db.Post, {
foreignKey: 'UsersId',
as: 'Liked',
through: 'PostLike'
})
서버에서 설정해준대로 프론트 코드를 수정하고, 좋아요 기능에 대한 라우터를 추가했더니 정상적으로 좋아요 눌렀을 때 데이터 추가 확인
데이터도 정상 저장 확인
( 추가적으로 해당 프로젝트는 nunjucks를 통해 프론트 화면을 구성하는데 익숙치 않아서 화면에 표기해주는데도 시간이 꽤 오래 걸렸다 🥲 )