말그대로 게시물을 불러올껀데 10개씩 제한을 둬서 불러올꺼다.
일단 문제가 잇을법한 거로 보여줄텐데
router.get("/",async(req,res,next)=>{
try {
const posts = await Post.findAll({
limit: 10,
offset:10,
// DESC 최신순 ASC 오래된순
order:[["creaetedAt","DESC"]]
})
res.status(201).send(posts)
} catch (error) {
console.error(error)
next(error)
}
})
여기서 limit는 10개씩 offset은 기준점부터 몇개씩 불러오는거고 order는 순서를 뜻한다.
근데 이렇게 가져오면되지 뭔소리야 라고 하는 미래의 나를 위해.... ㅠㅠ
offset: 10(변동이 됩니당) limit :10 이런식으로 가져오면 처음에 데이터를 가져왓는데 중간에 게시물이 추가가 되거나 삭제가 됬을때 문제가 된다 뭔소리야 그건또 라고 하면 예시를 보여주겠다.
20 19 18 17 16 15 .... 이런식의것 순서에서 만약 20앞에 21이 추가가 되면 10번부터 데이터를 가져와야할상황에 11번부터 가져오게 되는 대참사가 나버린다... 그레서 그게 뭔상관이야 라고 하면 무한스크롤시 문제가 된다 라는걸 알려주기 위한 개소리고
추가적으로 알게 된게 있다 라고한다면....
기존 공부를 했을때는 좋아요여부를 이렇게 꺼내 왓다.
include: [{
model: User, // 좋아요 누른 사람
as: 'Liked',
required: false,
attributes: ['id'],
through: {
attributes: []
},
}],
이렇게 하면 문제는 유저의 고유 id를 프론트에 넘긴다음에 프론트에서 계산을 해야한다는 단점이 있다.
또 내가 좋아요를 햇는지 안햇는지 에대한 데이터만 보낸다면 상관이 없지만 다른사람의 고유 id까지 같이 보내기 때문에 안좋은 코드라고 생각을 한다.
그레서 생각을 한게 이미 like라는 테이블이 있으니 여기서 postid 랑 Post테이블의 아이디랑 같으면서 지금 로그인 한사람의 고유 id와 like 테이블의 Userid 가 같은지를 비교하고 맞으면 true 다르면 false이렇게 계산을 때리면 되는데 어케하지 라고 생각 하며 서칭을 햇는데 방법은 의외로 간단햇다.
const users = req.user ? req.user.id : null;
// 좋아요 여부
[Sequelize.literal("IF((SELECT `postId` FROM `Like` WHERE `Like`.`postId` = `Post`.`id` AND `Like`.`userId` = " + users + "), true, false)"), "like"],
내가 해석한데로 말하면 만약에 Like테이블의 postId를 가져와 주면서 Like의 postid와 Post테이블의 id를 비교 하고 userId와 지금 로그인을 햇다면 그사람의 id값 없다면 null값을 줄테니 비교해줘 엿고 결과는 성공적이였다.
이거를 토대로 데이터 가공을 해봤는데
// 만든사람
[Sequelize.literal("(SELECT `nickName` FROM `Users` WHERE `Users`.`id` = `Post`.`userId`)"), "nickName"],
// 이미지 소스
[Sequelize.literal("(SELECT `src` FROM `Images` WHERE `Images`.`postId` = `Post`.`id`)"), "src"],
// 정규식 써서 태그를 없앰
[Sequelize.literal("REPLACE(REGEXP_REPLACE(`content`, '<[^>]+>', ''), ' ', '')"), 'content'],
// 좋아요 수
[Sequelize.literal("(SELECT COUNT(*) FROM `Like` WHERE `Like`.`postId` = `Post`.`id`)"), "count"],
첫번째는 유저테이블의 닉네임하고 포스트의 유저 아이디하고 비교해서 만든사람이름
두번째 도 마찬가지고
세번째는 게시물의 html을 제거해서 보내야하는데 정규식을 이용해봣당
마지막은 좋아요 수인데 Like테이블의 모든거를 카운트 하는데 비교대상은 Like테이블의 postid와 post테이블의 id를 비교하는거 ㅎㅎ 만드는데 오래걸리기고 잇긴한데 이번주 내로 마무리 지어야지 지금 거이 끝낫지롱 ㅋㅋ