본문 바로가기
  • 삽질하는 자의 블로그
공부용-사이드프로젝트/Nodejs - 미니프로젝트-쇼핑몰

4. 물품 올리기! 업데이트! 삭제까지!

by 이게뭐당가 2022. 9. 25.

시작에 앞서, 

 

MVC  패턴 작업으로

VIEW의 정보를 // 라우터에서 받아 //

라우터에 연결된 기능은 Controller에 //

Contoroller에 입력된 코드들 중, 데이터베이스에 접근하는 모든 항목들은 Model에 코딩되어있다.

 

물품을 올리기 위해서는 

VIEW에 있는 [ 파일을 비롯한 모든 정보를 받아와야한다]

ROUTE 에서 [ 서버로 연결시키고 ]

CONTROLLER 에서 [ 처리 과정을 담는다]

MODEL 에서는 [ CONTROLLER에서 DB 로 접근하는 것들을 담는다]

 

1. VIEW

VIEW와 결과

여기서 가장 유의할 점은

1.  Multer의 설치, 미들웨어 설정

2. enctype의 설정

3. csrfToken을 쿼리 매개변수로 보내기

multer 미들웨어 설정(npm multer), 실제 내가 설정한 미들웨어

 

2. ROUTER

ROUTER에서, 브라우저의 요청을 받아, 실행할 항목을 연결한다.

   Multer를 사용한 middleware를 사용하여, [모든 파일과, 모든 데이터에 관하여 서버로 넘겨주어야 한다]

   (현재,  VIEW에서 파일 편집기를 사용하고 있기 때문에, 또한 enctype 을 지정했기 때문에)

   만약, middleware를 사용하지 않는다면, req.body,  req.file 이 전무 undefined 가 나오거나, 오류가 발생할것이다.

 

 

3. CONTROLLER

컨트롤러에서는, 실제로 요청이 왔을때, 처리할 기능을 정의한다.

대부분 DB와 연결된 코드가 많기에, MODEL에서 많이 온다.

유의할 점은, 모든 [ 비동기 요청에 대하여] [오류처리 기능을 수동으로 입력해야한다는 점이다]

비동기식 요청은 자동으로 내가 만들어놓은 500 오류처리 미들웨어로 들어가지 않는다.

    * file에 대한 정보는 console.log(req.file) 을 쳐보면 정보들이 촥 나온다!

 

 

 

4. MODEL

MODEL 의 CONSTRUCTOR
MODEL 의 save 및 update

가장 핵심이라고 할 수 있는 Model 이다.

 

CONTROLLER의 중추를 담당한다 볼 수있다(현, 상황에서는 DB에 담고 옮기는 것이 주이므로)

 

저장에는 객체의 constructor에 id 값이 존재 할 수 없으므로(아직 DB에 의해 Product id가 할당되지 않았으므로)

id값이 없다면  save = insertOne() 이 되게 하여, DB에 집어넣는다

  사용시에, Product 사용자함수 안의 파라미터에 값을 넣고 불러오기때문에, 

   new 로 초기화한 사용자 함수에 req.body들의 값을 넣고, 함수를 불러온다.

 

업데이트에는 DB에서 다시 불러와서 찾아낸 후 업데이트 하기 때문에, Product의 id값이 존재한다.

id값이 있다면 save = updateOne() 이 되게하여, DB를 업데이트한다.

 

유의할점은

  1. 사용자로부터 DB의 값(파일의 위치와 숨겨논 URL)을 숨기기 위하여, DB 안에는 직접적인 경로 값을 저장하지 않았다.

    그러므로, 뽑아낸 값을 다시한번 사용자함수 Product에 집어넣어, 값을 뽑아내는 과정이 필요하다.

 

  2.  Multer에 의해 저장되어있는  기존 파일을 삭제하고, 새 파일을 저장하는 과정이 필요하다.

       그 과정은 node 내장함수인  fs 를 통해 가능하다.

      프로미스를 반환하는 fs = require("fs/promises") 로 패키지를 불러온 후

      await 를 사용하여, 이미지를 삭제한다.

 

fs official site

  이후 과정은 save와 동일하다.

 

그럼 끝!

댓글