findOne() null을 return?
서버에 몽고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})
})
});
- 결과화면
Author And Source
이 문제에 관하여(findOne() null을 return?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dev_shu/findOne-null을-return저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)