V-logue

[Node.js] - Express에 대해 주저리주저리 본문

발자취

[Node.js] - Express에 대해 주저리주저리

보그 2022. 5. 21. 16:47

Express 개괄 , 

const express = require("express");

변수 express에 require라는 함수를 통해서 "express"라는 패키지를 불러와서 실행시키겠다.

require = 패키지, 모듈을 가져오는 함수

const app = express(); // 변수 express를 함수처럼 사용하겠다.
const port = 3000; // localhost:3000

express홈페이지를 가면 위와같이 사용하라고 나와있다.

위와 같은 과정을 통해 express( )가 서버 객체를 받아올 수 있는 것이고, 변수 app에 서버 객체가 담기는 것이다.

express는 꼭 이렇게만 사용해야 한다(방법의 제약).

const express = require("express");
const app = express();
const port = 3000;

app.listen(port, () => {
    console.log(port, "포트 On");
});

위의 코드를 node app.js를 통해 실행시키면 

이라는 모양으로 localhost:3000이 실행된다. Ctrl + C를 통해 실행을 멈추면 사이트에 연결할 수 없다고 나온다.

일단 저 코드를 통해 어떤 변화를 있었음을 인지할 수 있지만, Get할 수 없다는 문제가 있다고 보인다.

이 때 필요한 것이 라우터이다.

app.get('/', (req, res) => {

});

 

위 코드는 get이라는 메서드로 요청을 받았는데, 그 경로가 ('/') 그냥 슬래시(localhost:3000/)일때 블락안에서

어떤 처리를 해주겠다 라는 뜻이다.

첫번째 인자 req(request)와 두번째 인자res(response)를 넣어주면(참고로 약속이다 이렇게 해야한다.)

블락안의 인자 req와 res를 통해 실행된 함수를 처리해주겠다는 것이다.

app.get('/', (req, res) => {
    res.send("Hello world");
});

 블락안에 res.send("Hello world");를 입력하고 실행시키게 되면, 

Cannot get이 Hello world로 바뀐것을 알 수 있게된다.


REST api

  1. 자원(Resource) - URL
    • 우리가 만들 소프트웨어가 관리하는 모든 것을 자원으로 표현할 수 있습니다. 쇼핑몰이라면 상품(Goods)에 대해서 정보를 관리할것이고 또는 장바구니(Carts)에 담긴 상품들도 관리해야겠죠.
  2. 행위 - HTTP method
    • 이전에 배웠던 HTTP method 기억나시나요? GET, POST 등등이 있다고 했었는데요. 이것으로 해당 자원에 대한 행위를 표현할 수 있습니다. 예를 들어 GET 메소드는 해당 자원의 조회, POST 메소드는 해당 자원의 생성 이런 식으로요.
    • 이렇게 나누어진 것을 보통 CRUD 라고 합니다. 자원에 대한 생성/조회/수정/삭제를 각각의 method 로 나누어놓은 것이지요.
Create : 생성(POST)
Read : 조회(GET)
Update : 수정(PUT)
Delete : 삭제(DELETE)
  1. 위 이미지의 예시처럼 쓰이는 것이 일반적인 method 사용방식입니다. 하지만 이것은 필수인 부분이 아니고 모든 곳에서 다 이렇게 지켜서 사용하지는 않습니다. 상황에 따라 저것을 완벽하게 지키기 어려운 부분들도 있으니 이 부분 참고 해주세요

3. 표현

  • 해당 자원을 어떻게 표현할지에 대한 설명입니다. 보통 JSON, XML 같은 형식을 이용해서 자원을 표현합니다.
  • HTTP에서는 Content-Type 이라는 헤더를 통해 표현 방법을 서술합니다.

HTTP 요청,

 

  • 모든 자원은 명사로 식별한다.
  • HTTP 경로로 자원을 요청한다 ( 자원 is Resource)
router.get('/users', ( req, res ) => {

})  // '/users'라는 경로로 자원인 resource를 요청한다

router.get('/users/:userid, (req, res) => {

})

 

  • GET : 자원을 조회,
  • POST: 자원을 생성,
  • PUT: 자원을 갱신,
  • DELETE: 자원을 삭제 // express의 자원의 메소드로 정해져 있다.
  • 200: 성공(success) , GET / PUT
  • 201: 작성됨(created), POST
  • 204: 내용없음(No Conent), DELETE                    // 200번대까지 자, 여기있다.
  • 400: 잘못된 요청(Bad Request)
  • 401: 권한 없음(Unauthorized)
  • 404: 찾을 수 없음(Not found)
  • 409: 충돌(conflict)      , 기존리소스와 중복 등      // 400번대는 서버쪽에서 보내는 나의 문제가 대부분
  • 500: 서버 에러(Interel server error)                      // 500번대는 서버 에러, 이쪽도 아마 내가문제

Express는 body를 제공하지 않기 때문에,

const bodyParser = require("body-parser)인 미들웨어를 app.use로 추가해야 한다. 

설치 명령어는 npm i body-parser -S


몽고 db 제어 명령어

  • db.collectionName.find({})
  • db.collectionName.insertOne({ key: "value", key2: "값" })
  • db.collectionName.deleteOne({ _id: ObjectId("...") }

find라는 함수는 promise를 반환한다. async (req, res) // 어싱크 함수를 사용해야함

router.post("/goods", async (req, res) => {
	const { goodsId, name, thumbnailUrl, category, price } = req.body;

  const goods = await Goods.find({ goodsId });

await을 사용할 수 있게 된다.

 

goodsId 파라미터로 넘어오는 것은 항상 문자열이다 그래서 Number함수로 감싼다.

 

ignoreUndefined: true

언디파인드로 넘어오는 값은 모두 무시해줘,

 

body같은 경우는 Number를 붙일 필요가 없는게 type까지 같이 넘겨받는다 Json형식 그대로

 

await이 들어가면 항상 res.json / 응답하라

 

게시글 목록 조회
-Request / Method : Get / URL : /articles
제목 / 작성자명 / 작성날짜
-Response / Status code: 200 / Payload ({ title: string, name: string, date: number}) .sort.reverse();

게시글 조회
-Request / Method : Get / URL : /articles/:articleId
제목/작성자명/작성날짜/작성내용
-Response / Status code: 200 / Payload ({ title:string, name:string, date:Number/ content:String})[]

게시글 작성
제목 / 작성자명/ 비밀번호 / 작성내용
-Request / Method: POST / URL : /articles/post / Body: { title: string, name: string, Pw:number, content: string }
-Response / Status Code: 201 / Payload ({ 위와 같음}) 
// Code 201은 Created

게시글 수정
입력된 비밀번호를 비교하여 동일할 때 글이 수정,
-Request / Method: PUT / URL : /articles/update / Body: { content: string // 
작성과 똑같이 받는 대신 조건을 위와 같이}
-Response / Status Code:200 / Payload { message: String}

게시글 삭제
입력된 비밀번호를 비교하여 동일할 때 글 삭제
-Request / Method: DELETE / URL: /articles/:articleId
-Response / Status Code:200 / Payload: { message : string }

 

 

req.params /

라우터 매개변수, 

 

예를들어 아래와 같은 코드가 있다고 하자,

// 요청온 url : www.example.com/public/100/jun
router.get('/:id/:name', (req, res, next) => {
 
  //../100/jun 부분이 담기게 된다.
  console.log(req.params) // { id: '100', name: 'jun' }
});

/:id/:name 경로가 있으면 ":id"속성과 ":name"속성을 req.params.id, req.params.name으로 사용할 수 있다.

 

req.query

- 경로의 각 쿼리 문자열 매개 변수에 대한 속성이 포함 된 개체다. (주로 GET 요청에 대한 처리)].

www.example.com/post/1/jun?title=hello! 이면,

title 매개변수(parameter)의, hello!이라는 값(argument)을 가져온다.

// 요청온 url : www.example.com/public/100/jun?title=hello!
app.use(express.urlencoded({ extended: false })); // uri 방식 폼 요청 들어오면 파싱
 
router.get('/:id/:name', (req, res, next) => {
 
  //../100/jun 부분이 담기게 된다.
  console.log(req.params) // { id: '100', name: 'jun' }
  
  // title=hello! 부분이 담기게 된다.
  console.log(req.query) // { title : 'hello!' }
});

 

req.body

- JSON 등의 데이터를 담을때 사용한다. (주로 POST로 유저의 정보 또는 파일 업로드(formdata)를 보냈을 때 )

요청 본문에 제출 된 키-값 데이터 쌍을 포함한다.

app.use(express.json()); // json 형식 폼 요청 들어오면 파싱
 
// 요청온 url : www.example.com/public/100/jun
router.post('/:id/:name', (req, res, next) => {
 
  // public/100 부분이 담기게 된다.
  console.log(req.params) // { id: '100', name: 'jun' }
  
  // post보낼때 담은 객체 부분이 담기게 된다.
  console.log(req.body) // { name: 'nomad', age: 11, married: true }
  
});

 

'발자취' 카테고리의 다른 글

E2E 테스트를 향한 개인적인 소감  (0) 2023.11.30
트러블 슈팅 - 조회 성능 개선  (0) 2022.08.08
[Nginx] 프로젝트 속 Nginx와 proxy  (0) 2022.07.31
Comments