9월 9일 (목) Node.js Express

남이섬·2021년 9월 9일
0

Express 설치 및 응답

설치

npm install express

express 불러온 후 express 사용, port 번호 지정

const express = require('express')
const app = express()
const port = 3000

메소드를 통한 요청, 응답 받아오기

ex)

app.get('/', (req, res) => {
  res.send('Hello World!')
})
express.메소드(endpoint, 요청응답 콜백함수)

위와 같이 응답메소드 중 send() 메소드를 통하여 요청에 대한 응답을 보내 줄 수있다

응답 메소드 send(), json(), end() 차이

  • res.send() 는 send에 전해진 argument에 따라서 Content-type이 자동적으로 만들어진다. 기본으로 응답을 보낸때 사용
  • res.json() 은 json이 아닌 것도 json 형식으로 바꾸어서 보내준다. 즉 content-type 헤더를 application/JSON으로 고정한다. 그런데 결국 res.json()도 마지막에 res.send()를 호출한다.
  • res.end() 는 보내줄 아무 데이터도 없는데 response를 끝내고 싶을 때 사용한다.ex) res.status(400).end();

요청 데이터 받아오기

미들웨어

요청과 응답 사이에서의 중간 공정, 반드시 실행되는 공정

예를들어 request에 필요한 기능을 더하거나, 문제가 발견된 불량품을 밖으로 걷어내는 역할을 한다

미들웨어 예시

위의 이미지와 같이 나열된 설정들을 추가 삭제 할 수가 있다

자주 사용하는 미들웨어

  • 모든 요청에 대해 url이나 메소드를 확인할 때
  • POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
  • 모든 요청/응답에 CORS 헤더를 붙여야 할 때
  • 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때

미들웨어 사용시
app.use() 처럼 router.use()도 쓸 수 있고 app.METHOD() 처럼 router.METHOD()도 사용 가능하다

useMETHOD의 차이점

  • use()모든 METHOD에서 동작한다는 것
  • METHOD()지정된 요청(GET, POST, PUT, DELETE 등)에서만 동작을 한다는 것

애플리케이션 레벨 미들웨어

모든 요청에 의한, 모든요청에 미들웨어가 포함되길 원한다면 애플리케이션 레벨 미들웨어를 사용한다

라우터 레벨 미들웨어

어떤 특정한 라우팅에 관련해서 중간에 넣기를 원한다면 라우터 레벨 미들웨어를 사용한다

미들웨어를 통하여 요청에 대한 body를 받아오는 법

json 형식

const bodyParser = express.json()

bodyParser라는 변수에 express의 json 메소드를 이용하여 할당

json형식으로만 요청을 받을 수 있다

ex)

{
   "text": "southbig"
}

json 메소드 strict false 적용

strict false 적용

const bodyParser = express.json({ strict: false })

strict을 false로 적용하게 되면 다른형태의 요청들을 json형태로 변환 해줄 수 있다
예를들어 json형태의 요청이 아닌 text형태(원시타입(primitive type))의 요청도 json형태로 변경해 준다
대신 json요청이기에 따옴표를 꼭 붙여줘야 한다


text 형식

const bodyParser = express.text()

bodyParser라는 변수에 express의 text 메소드를 이용하여 할당

text형식으로만 요청을 받을 수 있다

ex)

아무 text나 가능

미들웨어 작성

var express = require('express');
var app = express();
var myLogger = function (req, res, next) {
  console.log('LOGGED');
  next();
};
app.use(myLogger);
app.get('/', function (req, res) {
  res.send('Hello World!');
});
app.listen(3000);

위와 같은 예제 코드와 같이 중간에 myLogger라는 미들웨어를 작성해 놓는다면 마지막 app.get()의 응답이 될때 무조건 myLogger는 불리게 된다

어떤부분, 어떤 요청이 진행되어 응답이 되는지 확인하는데 아주 유용하다

추가적으로 위와같이 cors와 bodyParser부분이 간단히 생략 되어 쓰여져 있지만 아래와 같이 미들웨어 로직으로 구성되어 있다

app.use(cors())

let cors = (corsOption) => {
  return (req, res, next) => {
  // cors 헤더 붙이는 로직
    next()
  }
}

app.use(bodyParser)

express.json = (option) => {
  return (req, res, next) => {
  // body 파싱하는 로직
    next()
  }
}

오류처리

맨 첫번째 인자로 err를 받는다
파라미터가 4개면 오류처리, 3개면 미들웨어로 취급한다, 2개면 응답으로 취급한다
파라미터의 갯수에 따라 동작에 차이가 있다

오류 처리

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

express 사용시 많이 나오는 에러

SyntaxError: Unexpected token a in JSON at position 0
이것은 json형식이 아니다

github express

profile
즐겁게 살자

0개의 댓글