본문 바로가기
개발/차근차근 개발일지 TIL

WIL & TIL 230414_Node.js 입문2

by 코딩하는짱구 2023. 4. 18.
반응형

✅오늘 학습 Keyword

1. "객체구조분해할당" 이란?

얘네들처럼 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식

router.put("/posts/:_postId", async (req, res) => {
  const { _postId } = req.params; // Changed _postId to postId to match parameter name
  const { content } = req.body;

2. Middle ware

서버 애플리케이션에서 요청(req)와 응답(res)사이의 처리를 담당하는 소프트웨어 컴포넌트.

함수의 형태로 작성됌. 

중요한것!! 미들웨어는 클라이언트의 요청이 서버에 도착하면 라우터(router)이전 단계에서 실행된다!

 

3. Schema란? 왜필요한가? routes의 data로 충분하지않나?

스키마는 데이터 구조를 정의하는데 사용되고 데이터베이스에서 주로 사용된다. 

데이터베이스의 일관성을 유지하고 무결성을 보장한다. 

js는 동적인 언어이기 때문에 데이터 모델이 변경될 수 있는데, 스키마가 데이터 모델을 명확하게 정의할 수 있다. 

즉 스키마는 데이터의 '모델, 형태' 이지 데이터 그 자체가 아니기에 반드시 필요. 

 

4. routes폴더에 들어가는 data들이 실제로 어떤 역할인지?

route는 클라이언트의 req와 res를 반환하는데 사용되는 URL 경로임. 

일반적으로 라우트는 HTTP메서드(GET, POST, PUT, DELETE등)과 함께 사용됌.

라우트 폴더에 들어가는 데이터는 일반적으로 라우트에서 사용되는 정보를 정의하고

이는 주로 미들웨어, 컨트롤러, 모델 등으로 구성됌. 아래는 Chat GPT의 부가설명이며 참고하면 좋을 것 같아서 첨부.

from Chat GPT

 

5. params와 body의 차이?

일단 params와 body 모두 HTTP요청, 즉 req의 데이터를 전달하는데 사용됌!

 

Params

params는 URL경로에서 동적으로 변하는 값, 즉 URL에 입력하는 값임. 

주로 GET 요청에서 많이 사용되며 URL뒤에 ? key-value 형식으로 파라미터 전달. 

ex)

http://example.com/users?id=1 <<요기, id가 key, 1이 value.

즉 파라미터는 한 글자가 아니라 key와 value로 이루어진 형태!!!

 

Body

HTTP요청메시지의 본문(Body)에 포함된 데이터

주로 POST에서 사용되고 데이터는 일반적으로 JSON 또는 HTML form 데이터 형식으로 전달 

ex)

POST http://example.com/users
Content-Type: application/json

{
  "id": 1,
  "name": "John"
}

 

"id"와 "name"이라는 두개의 property가 json형식으로 body에 포함되어 전송됌. 

 

6. CRUD

create, read, update, delete

 

7. Routing이란?

클라이언트 요청이 들어오면 해당 요청을 적절한 코드로 연결해준다. 연결.

 

8. RESTful?

웹 어플리케이션에서 자원을 URI로 표현하고 HTTP 메서드를 이용하여 자원에 대한 CRUD 작업을 수행하는 아키텍쳐. 

 

✅오늘 겪은 문제

아래와 같이 입력시

게시글 상세조회에서 params에 비교할 _id의 값과 다른 값을 입력했을때,  "데이터 형식이 올바르지 않습니다."라는 에러 메세지가 뜨지않고 서버가 아예 끊겨버린다.

router.get("/posts/:_postId", async (req, res) => {
  const { _postId } = req.params; //객체 {postId: 'none'}
 
  const detail = await Post.findOne({ _id: _postId }); //data에 _postId와 _id 대응되는 값 = detail
  console.log(detail);

  if (!detail) {
    return res
      .status(400)
      .json({ message: "데이터 형식이 올바르지 않습니다." });
  }
  res.json({ detail });
});
 

 

✅해결 시도, 방법

 

1.findOne을 find로 바꿔봤으나 소용없었다. 

2. 두번째 if문의 !detail을 !datail || detail.length === 0 으로 바꿔보았으나 소용 없었다. 

3. 이유가 뭘까 계속 찾아보다가 _id값의 길이가 다르면 이 에러가 나는 것 같아서 길이에 대한 제한을 줬는데,

그렇게 하면 if조건 입력시 길이가 달라져도 서버가 끊기진 않지만 반대로 옳은 값을 입력했을때 원하는 값이 출력되지 않음. 

router.get("/posts/:_postId", async (req, res) => {
  const { _postId } = req.params; //객체 {postId: 'none'}
  // _postId의 길이? 문제?
  if (_postId.length !== Post.findOne({ _id: _postId }).length) {
    return res
      .status(400)
      .json({ message: "데이터 형식이 올바르지 않습니다." });
  }
  const detail = await Post.findOne({ _id: _postId }); //data에 _postId와 _id 대응되는 값 = detail
  console.log(detail);

  if (!detail) {
    return res
      .status(400)
      .json({ message: "데이터 형식이 올바르지 않습니다." });
  }
  res.json({ detail });
});

✅알게된 점

오늘 해결하지는 못했다. 

사실 문제에서 요구한 것은 맞는 값을 입력했을 때 게시물이 조회되는 것 이기에 

길이가 다른 문자열까지 생각할 필요는 없는 것 같지만 내일 다시 한 번 문제 해결을 해볼 생각이다. 

 

아울러 API가 구축되고 연결되는 시스템의 개념을 좀 더 명확히 해야할 것 같다. 

반응형