• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Next.js 게시판 댓글 작성 좋아요 응용문제

댓글 작성 좋아요 응용문제

2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 글쓴이
  • #95598

    정민규
    참가자
    import { connectDB } from "@/util/database";
    import { ObjectId } from "mongodb";
    export default async function handler(req, res) {
    if (req.method === "POST") {
    let data = JSON.parse(req.body);
    const db = (await connectDB).db("forum");
    const newLike = {
    clickedUser: data.userEmail,
    postId: data.postId,
     };
    let userCheck = await db
     .collection("like")
     .find({ clickedUser: data.userEmail })
     .toArray();
    let countCheck = await db
     .collection("post")
     .find({ _id: new ObjectId(data.postId) })
     .toArray();
    let nowCount = countCheck[0].like;
    if (userCheck.length === 0) {
    let increaseLike = await db.collection("like").insertOne(newLike);
    let increaseCount = await db.collection("post").updateOne(
     { _id: new ObjectId(data.postId) },
     { $inc: { like: 1 } } 
     );
    return res.status(200).json("글에 좋아요를 눌렀습니다");
     } else {
    for (let i = 0; i < userCheck.length; i++) {
    if (userCheck[i].postId == data.postId) {
    return res
     .status(400)
     .json("이미 좋아요를 클릭한 게시글입니다.");
     }
     }
    
    let increaseLike = await db.collection("like").insertOne(newLike);
    let increaseCount = await db.collection("post").updateOne(
     { _id: new ObjectId(data.postId) },
     { $inc: { like: 1 } } 
     );
    return res.status(200).json("글에 좋아요를 눌렀습니다");
     }
     }
    }
    이렇게 서버 파일을 구성했고
    "use client";
    import Link from "next/link";
    export default function ListItem({ result, userId }) {
    const increaseCount = (e) => {
    const listItem = e.target.closest(".list-item");
    let postId = e.target.parentElement.firstChild.href.split("/")[4];
    let userEmail = userId;
    let updateCount = Number(listItem.children[4].innerHTML) + 1;
    fetch("api/post/like", {
    method: "POST",
    body: JSON.stringify({
    postId: postId,
    userEmail: userEmail,
    updateCount: updateCount,
     }),
     });
     };
    return (
    <>
    {result.map((item, i) => {
    return (
    <div className="list-item" key={i}>
     <Link href={`/detail/${result[i]._id}`}>
     <h4>{item.title}</h4>
     </Link>
     <Link href={`/edit/${result[i]._id}`}>✏️</Link>
     <span
    onClick={(e) => {
    fetch("/api/post/delete", {
    method: "DELETE",
    body: JSON.stringify({
    id: result[i]._id,
    author: result[i].author,
     }),
     })
     .then((res) => {
    if (res.status == 200) {
    return res.json();
     } else {
    // 서버가 에러코드 전송 시 실행할코드
     }
     })
     .then((res) => {
    // 성공시 실행할 코드
     e.target.parentElement.style.opacity = 0;
    setTimeout(() => {
     e.target.parentElement.style.display =
    "none";
     }, 1000);
     })
     .catch((err) => {
    //인터넷 문제로 실패시 실행할코드
    if (res.status == 500) {
     console.log(err);
     }
     });
     }}
    >
     🗑️
     </span>
     <span onClick={increaseCount}>👍</span>
     <span>{item.like}</span>
     <p> 1월1일</p>
     </div>
     );
     })}
     </>
     );
    }
    // fetch(`/api/test?id=${result[i]._id}`, {
    // method: "DELETE",
    // })
    // .then((res) => {
    // if (res.status == 200) {
    // return res.json();
    // } else {
    // // 서버가 에러코드 전송 시 실행할코드
    // }
    // })
    // .then((res) => {
    // // 성공시 실행할 코드
    // e.target.parentElement.style.opacity = 0;
    // setTimeout(() => {
    // e.target.parentElement.style.display =
    // "none";
    // }, 1000);
    // })
    // .catch((err) => {
    // //인터넷 문제로 실패시 실행할코드
    // });
    이렇게 ListItem 파일 작성했고
    현재 한 계정으로는 한 게시글당 좋아요 1번 구현에 성공은 했습니다.
    코드에서 비효율적이어서 보완해야할 부분이 있는 지 궁금합니다 ! 아니면 뭔가 에러가 발생할만한 부분이 있는지도 궁금합니다!
     
    #95615

    codingapple
    키 마스터
    현재 유저 이메일은 보내라고하지말고 getServerSession() 같은걸로 출력해서 씁시다
    유저가 클릭한 document 전부 가져오라는거보다 
    해당글id와 유저이메일이 둘 다 수록된 document만 검색해보면 전부 가져올 필요 없을듯요
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠