inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기

구독 기능 (2)

구독,구독취소에 대해 질문이 있어요

708

is b

작성한 질문수 4

1

안녕하세요 ... 구독, 구독취소 잘 적용이되는데 페이지 새로고침만하면 왜 버튼이 다시 구독전으로 돌아갈까요...

db확인해보니 구독할때마다 계속 구독정보가 저장되더라구요

_id값만 다르게 계속 중복저장돼서 그런가싶기도하고

뭐가 문제인지 모르겟네요 ㅠㅠ

const express = require("express");
const router = express.Router();
const { Subscriber } = require("../models/Subscriber");

//=================================
//             Subscriber
//=================================

router.post("/subscriberNumber", (req, res) => {
  Subscriber.find({ userTo: req.body.userTo })
    .exec((err, subscriber) => {
      if (errreturn res.status(400).send(err);
      return res
        .status(200)
        .json({ success: true, subscriberNumber: subscriber.length });
    });
});

router.post("/subscribed", (req, res) => {
  Subscriber.find({ userTo: req.body.userTo, userFrom: req.body.userFrom })
    .exec((err, subscriber) => {
      if (errreturn res.status(400).send(err);

      let result = false;

      if (subscriber.length !== 0{
        result = true;
      }

      res.status(200).json({ success: true, subscribed: result });
    });
});

router.post("/unSubscribe", (req, res) => {
  Subscriber.findOneAndDelete({
    userTo: req.body.userTo,
    userFrom: req.body.userFrom,
  }).exec((err, doc) => {
    if (errreturn res.status(400).json({ success: false, err });
    res.status(200).json({ success: true, doc });
  });
});

router.post("/subscribe", (req, res) => {
  const subscriber = new Subscriber(req.body);
  subscriber.save((err, doc) => {
    if (errreturn res.status(400).json({ success: false, err });
    res.status(200).json({ success: true, doc });
  });
});

module.exports = router;
import React, { useEffect, useState } from "react";
import Axios from "axios";

function Subscribe(props) {
  const [SubscriberNumber, setSubscriberNumber] = useState(0);
  const [Subscribed, setSubscribed] = useState(false);

  useEffect(() => {
    let variables = { userTo: props.userTo };

    Axios.post("/api/subscribe/subscriberNumber", variables).then(
      (response) => {
        if (response.data.success{
          setSubscriberNumber(response.data.subscriberNumber);
        } else {
          alert("구독자수를 확인하는데 실패했습니다.");
        }
      }
    );

    let subscribedVariables = {
      userTo: props.userTo,
      userFrom: localStorage.getItem("userId"),
    };

    Axios.post("/api/subscribe/subscribed", subscribedVariables).then(
      (response) => {
        if (response.data.success{
          setSubscribed(response.data.subscribed);
        } else {
          alert("구독했는지 확인하지 못했습니다.");
        }
      }
    );
  }, []);

  const onSubscribe = () => {
    let subscribeVariables = {
      userTo: props.userTo,
      userFrom: props.userFrom,
    };

    if (Subscribed{
      Axios.post("/api/subscribe/unSubscribe", subscribeVariables).then(
        (response) => {
          if (response.data.success{
            setSubscribed(!Subscribed);
            setSubscriberNumber(SubscriberNumber - 1);
          } else {
            alert("구독취소를 실패했습니다.");
          }
        }
      );
    } else {
      Axios.post("/api/subscribe/subscribe", subscribeVariables).then(
        (response) => {
          if (response.data.success{
            setSubscribed(!Subscribed);
            setSubscriberNumber(SubscriberNumber + 1);
          } else {
            alert("구독을 실패했습니다.");
          }
        }
      );
    }
  };

  return (
    <div
      style={{
        backgroundColor: `${Subscribed ? "#AAAAAA" : "#CC0000"}`,
        borderRadius: "4px",
        color: "white",
        padding: "10px 16px",
        fontWeight: "500",
        fontSize: "1rem",
        textTransform: "uppercase",
      }}
      onClick={onSubscribe}
    >
      {Subscribed ? "Subscribed" : `${SubscriberNumber}  Subscribe`}
    </div>
  );
}

export default Subscribe;

mongodb react nodejs redux

답변 2

1

beginagain

안녕하세요 저도 같은 문제인데 혹시 해결하셨을까요

0

official

1.전 VideoDetailPage.js에서 Subscriber 컴포넌트에 props로 _id를 넘길 때 writer의 _id를 넘겨야 하는데 video의 _id를 넘기고 있더라구요. 다음과 같이 수정했습니다.

                <div style={{ width: '100%', padding: '3rem 4rem'}}>
                    {VideoDetail.writer && (<div>
                        <video style={{width: '100%', height: '70vh'}} src={`http://localhost:6001/${VideoDetail.filePath}`} controls/>
                        <List.Item actions={[<Subscriber userTo={VideoDetail.writer._id}/>]}>
                            <List.Item.Meta title={VideoDetail.title} description={VideoDetail.description}/>
                        </List.Item>
                    </div>)
                    }
                </div>

0

official

2. 혹은 useEffect에서 depth array에 props를 넣어보세요

0

시우쿤

useEffect() 전, 후로 Subscribed state 콘솔로그 찍어보시고 값이 어떤지 확인해 보세요. 저는 처음의 값은 false였는데,
useEffect()하고 나서 undefined 떠서 디비에서 제대로 값을 보내는지 확인해서 해결했습니다.

npm i하면 바로, 라이브러리 오류없이 받아지고, 구동되는 소스는 없나요?

0

52

1

ERROR in ./node_modules/antd/es/version/index.js 2:15-22

0

221

1

자료 없음

0

321

1

이미지 깨짐

0

335

1

npm run dev 동작 에러

0

304

1

npm run dev 동작 에러

0

294

1

npm run dev 동작에러납니다...

0

660

1

npm run dev 실행 오류

0

653

1

비디오 업로드, 로그인, 회원가입 504 error

0

1056

1

시작부터 오류생기시는 분들 해결법입니다.

1

467

1

오류 해결 공유

0

458

1

npm install 에러 질문드립니다.

0

1121

2

아예 몽고DB에 연결한다고만 하고 연결이 안되고 있습니다.

0

550

1

해당 오류 해결 방법 좀 알려주세요 ㅠㅠ

0

515

1

로컬스토리지에 대한 질문입니다!!

0

515

0

video가 안 나타나는 문제

0

893

1

ffmpeg 설치 후 cannot read property 'format' of undefined 500 에러 해결

0

470

0

typeError or 콘솔 500 뜨는분..

0

336

0

npm run dev 관련 오류

0

578

1

답글이 달리지않고 디비에도 저장되지않으며 새로고침이 됩니다.

0

246

0

useState 자동 생성

0

345

1

TypeError: Cannot read properties of undefined (reading 'format')

0

1246

2

userData undefined / state에 user.userData가 없습니다.

0

247

0

antd Input background color 변경

0

241

0