230208 / put 사용하기(어려움)

신동윤·2023년 2월 7일
0

강의를 보고 처음 작성한 코드

//_id와 password를 이용한 게시글 수정 
router.put("/posts/:_id", async (req, res) => {
  const { _id } = req.params;
  const { password, title, content } = req.body;

  const posts = await Post.find({ _id });
  const existspost = posts.find(x => x.password === password)
  if (existspost.length) {
    const result = await Post.updateOne({password}, { $set: {title, content} })
    return result;
  }
  res.json({ "message": "게시글을 수정하였습니다." })
});
  1. _id를 파라미터로 받는다. req.params와 구조분해를 이용해 _id: 123981720948..이런 값을 받아온다.
  2. 수정되거나 값을 비교할 3가지를 req.body에서 불러온다.
  3. Post모델에서 _id 값과 같은것을 가져와 posts에 넣어준다.
    4. 배열이 된 posts를 find 메소드를 사용하여 Post의 패스워드와, body에서 받아온 패스워드를 비교
    5. 그 값의 길이가 존재한다면 (0이 아니라면) if문 진행
    6. 패스워드는 바뀌지 않으니 앞에, 타이틀과 콘텐츠는 바뀌니 $set뒤에 위치한다.
    7. 수정이 되던지 되지 않던지 json호출
  1. posts는 객체임
  2. 객체의 length는 undifined가 나옴 if문이 돌아가지 않음
  3. updateOne은 앞에 구분할수있는 _id 값이 나와야함

수정되고 수정된 코드

//_id와 password를 이용한 게시글 수정 
router.put("/posts/:_id", async (req, res) => {
  const { _id } = req.params;
  const { password, title, content } = req.body;

  const post = await Post.findById(_id);
  
  if (post) {
    if (post.password !== password) {    //post.length가 unditinde length는 배열과 문자열에서만 사용된다.
      throw new Error('비밀번호 X');
    }
    
    await Post.updateOne({ _id }, { $set: { title, content } }) //찾는게 무엇인지 알려줘야함 첫번째에 password는 같은값이 나올수있음 _id 고유값
    return res.json({ "message": "게시글을 수정하였습니다." }) //return으로 인해 밑에가 실행이 되지않고 종료가 된다. 함수
  }
  return res.json({ "message": "실패하였습니다." })  // 요청과 응답으로 이루어 지기 때문에 if가 있을때 참이여야만 res가 나온다. res가 없으면 계속 돌아가버린다. 1req 1res
});
  1. async를 이용하여 비동기적 실행
  2. _id를 파라미터로 받는다. req.params와 구조분해를 이용해 _id: 123981720948..이런 값을 받아온다.
  3. 수정되거나 값을 비교할 3가지를 req.body에서 불러온다.
  4. Post 모델에서 값을 불러올때 await이용, findById와 find는 다름 (1)
  5. if문 post가 객체라면 true이기에 진행, id가 없을땐 null반환
  6. 다음 if문에서 Post의 패스워드와, body에서 받아온 패스워드를 비교하여 오류 검출 (if문 안에 넣어서 post가 있다면 진행되게 만듬)
  7. updateOne에서 구분할 수 있는 _id 값을 넣어준다.
  8. res는 여러개가 나오면 안되기 때문에 return을 이용해서(함수에서 return이 나오면 중기되기에) 오류문을 작성해준다.

검토 (2번 중요)

  1. Object.keys(post)를 이용해서 객체인지 확인해봤었다.
  2. find로 없는 id 를 넣었을때 빈 배열(true), findById로 없는 id를 넣었을때 null이라 오류 발생 ***(2)
  3. console.log()를 이용하여 어디에서 값이 나오지 않는지 확인하였다. (보통 post에서 객체, undified, 배열로 잘 안됐었다.
  4. if문 안에 res를 넣었더니 오류가 났을 때 계속 돌아가는 오류가 났다. res는 한번은 나와야되기 때문

참고
(1) https://jungsikjeong.github.io/memo/2021/05/15/memo/
(2) https://gurtn.tistory.com/122

0개의 댓글