WILT-191029

1 분 소요

오늘 한 일

  1. 블록체인 강의 듣고 정리
  2. node 서버 글 읽기(Read), 쓰기(Create) 기능 추가
    • CastError: Cast to ObjectId failed for value "~~" at path "_id" for model "posts"
    • 게시물 읽기에서 req.params.idpost.findById()호출하니 발생한 오류. mongodb에서는 id:id를 자연수 대신 _id:ObjectId라는 고유 객체를 만들어서 사용하는데 그냥 string으로 전달한 값을 그대로 넣으면 casting 에러가 나는 듯 했다. 그래서 stringObjectID로 바꾸는 방법 찾아서 변환 후 사용하니 게시물을 찾을 수 있었다.
    • StringToObjectID
    • 원래 게시물 생성할 때는 로그인 한 유저인지 확인 후 유저 정보 가져와서 게시물에 넣어야 한다. 아마 세션에서 가져올 것 같은데, 아직 이 부분은 처리하지 않았다. (현재 아무나 글 쓸 수 있음)
    • 게시물 수정, 삭제까지 만들고 나서 안드로이드에 붙일 예정
  3. 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);
  1. 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);
          }
  });

댓글남기기