오늘 한 일
- 블록체인 강의 듣고 정리
- node 서버 글 읽기(Read), 쓰기(Create) 기능 추가
CastError: Cast to ObjectId failed for value "~~" at path "_id" for model "posts"
- 게시물 읽기에서
req.params.id
로 post.findById()
호출하니 발생한 오류. mongodb
에서는 id:id
를 자연수 대신 _id:ObjectId
라는 고유 객체를 만들어서 사용하는데 그냥 string
으로 전달한 값을 그대로 넣으면 casting 에러가 나는 듯 했다. 그래서 string
을 ObjectID
로 바꾸는 방법 찾아서 변환 후 사용하니 게시물을 찾을 수 있었다.
- StringToObjectID
- 원래 게시물 생성할 때는 로그인 한 유저인지 확인 후 유저 정보 가져와서 게시물에 넣어야 한다. 아마 세션에서 가져올 것 같은데, 아직 이 부분은 처리하지 않았다. (현재 아무나 글 쓸 수 있음)
- 게시물 수정, 삭제까지 만들고 나서 안드로이드에 붙일 예정
- routes/post.js 에 Create라우터 추가했음
// routes/post.js
// 게시물 작성
router.post('/', (req, res, next)=>{
// 일단 commenter(이름) 직접 입력, 세션 정보 안 받아옴
const {commenter, title, content} = req.body;
const post = new Post();
// post.userid = userid; //추후 세션에서 아이디, 이름 가져오기
post.commenter = commenter;
post.title = title;
post.content = content;
// date(origin, last), hit, comment는 default값 있음
post.save(function(err, post){
if(err){
console.error(err);
return next(err);
}
console.log(title+" 생성 성공");
res.status(201).json(title+" 생성 성공");
//res.redirect('/auth/login'); // 성공 시 리다이렉션
});
});
module.exports = router;
//app.js
const postRouter = require('./route/posts');
app.use('/posts', postRouter);
- routes/post.js 에 Read 라우터 추가했음
// Sstring을 ObjectId로 바꾸기 위해 모듈 불러옴
const ObjectId = mongoose.Types.ObjectId;
// 개별 게시물 확인
router.get('/:id', (req, res, next)=>{
// req.params.id로 받은 string값을 ObjectId객체로 바꿔준다.
const id_obj = ObjectId(req.params.id);
try{
Post.findById(id_obj, async function(err, post){
if(err){
console.error(err);
return next(err);
}
if(post){
const { title } = post;
console.log(`${title} 클릭`)
req.flash(`${title} 클릭`);
return res.json({success:true, data: post});
}else{
console.log('게시물 없음');
return res.json({success:false, message:'게시물 없음'});
}
});
} catch(error){
console.error(error);
return next(error);
}
});
댓글남기기