findOne() null을 return?

Siwoo Pak·2021년 6월 15일
0

MongoDB

목록 보기
2/4

서버에 몽고db에 저장된 비디오의 데이터를 가져오려고 하는데,
계속 데이터를 가져오지 못한다고 브라우저에 뜨는.. 뭐지?
이 부분은 데이터를 읽어오기전에 먼저 html소스를 가져와서
이런 에러 페이지가 떠버림. 이건 조건부렌더링으로 처리해서 해결.

코드를 보면

  • client단에서
  • 비디오 디테일 페이지에 들어오면 우선 비디오 정보를 먼저 가져올수 있게 useEffect()를 사용하였고, Axios를 통해
    '/api/video/getVideoDetail' 라우터로 이동. 이때 전달인자로 videoId가 할당된 variable. 성공적으로 db의 정보를 가져오면 setVideoDetail로 그 정보를 저장하고 실패하면 알림으로 띄움.
// a태그의 href속성에서 props로 넘겨준 videoId
const videoId = props.match.params.videoId;
// db에 videoId 정보를 전달해줄 인자 variable
const variable = { videoId: videoId };
// state를 통해 비디오 정보를 저장하고 쓸 수 있게 해줌.
// 기본적으로 비디오 정보를 배열로 담아오기 때문에
// 배열로 초기화
const [VideoDetail, setVideoDetail] = useState([]);
useEffect(() => {
    Axios.post("/api/video/getVideoDetail", variable).then((response) => {
      if (response.data.success) {
        //console.log(response.data)
        setVideoDetail(response.data.videoDetail);
      } else {
        console.log(response.data)
        alert("비디오 정보를 가져오길 실패했습니다.");
      }
    })
  })
  • 2.server단
  • 리퀘스트로 받은 데이터 videoId를 통해 mongodb의 findOne()를 사용하여 조회. populate('writer')를 통해
    그 writer의 모든 정보를 가져올 수 있게 하고, 조회에 성공하면
    videoDetail이라는 변수에 담아서 response!
router.post("/getVideoDetail", (req, res) => {
    // 비디오 정보를 가져온다. 
    //console.log(req.body);
    Video.findOne({"_id": req.body.videoId})
        .populate("writer")
        .exec((err, videoDetail) => {
            if(err) return res.status(400).send(err);
            return res.status(200).json({success: true, videoDetail})
        })
    
});
  • 계속 null을 리턴해서 코드가 잘못된 건가 싶었지만, studio 3t프로그램을 깔아서 db에 연결해보니 그냥 _id: videoId 를 할 경우 정보를 찾을수 없어서 null을 리턴..
  • videoId를 ObjectId에 넣어서 조회해보니 성공.
  • 구글링 검색해보니
    • db 연결을 mongodb로 사용하였을 시
//native_parser를 사용하지 않은 경우
//(_id의 값을 직접 설정한 경우)
var BSON = require('mongodb').BSONPure;
var o_id = BSON.ObjectID.createFromHexString(theidID);

//native_parser를 사용하지 않는 경우
//(_id의 값을 직접 설정하지 않고 document가 만들어질 때 자동생성 된 경우)
var BSON = require('mongodb').BSONNative;
var o_id = BSON.ObjectID.createFromHexString(theidID);
  • db 연결을 mongoose로 사용하였을 시
var ObjectId = require('mongoose').Types.ObjectId; 
var query = { campaign_id: new ObjectId(campaign._id) };
router.post("/getVideoDetail", (req, res) => {
    // 비디오 정보를 가져온다. 
    //console.log(req.body);
    let ObjectId = require('mongoose').Types.ObjectId;
    let videoId = req.body.videoId;	
    Video.findOne({"_id": new ObjectId(videoId)})
        .populate("writer")
        .exec((err, videoDetail) => {
            if(err) return res.status(400).send(err);
            return res.status(200).json({success: true, videoDetail})
        })
    
});
  • 결과화면
profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글