Express.js

최경락 (K_ROCK_)·2022년 1월 5일
0

https://expressjs.com/ko/starter/installing.html
→ 공식문서를 참고하여 작성한 글입니다.

Express.js 란?

  • 프레임워크 중 하나로, node.js 환경에서 서버를 구축하기 쉽게 만들어주는 프레임워크이다.
  • 미들웨어의 추가가 편리하고, 자체적으로 라우터 기능을 제공한다.

설치하기

  • npm install express --save 를 이용하여 설치한다.
  • 뒤의 --save 플래그는 해당 프레임워크를 package.jsondependencies 에 추가하며, 이후 npm i 를 이용하여 설치 할 수 있게 해준다.

라우팅

  • 어떤 요청이 전달 된 경우 요청의 HTTP 메소드path 를 비교하여 해당 요청에 맞는 응답을 하는 기능.
  • http 객체를 사용하는 경우 if 문을 이용하여 분기 시켜주어야 하지만, Express.js 는 자체적으로 라우팅 기능을 내장한다.
  • http 객체의 경우 요청 객체에서 methodurl 을 가져와 비교문을 작성한다.
// http 객체를 사용하는 경우

const http = require('http');

const server = http.createServer((req, res) => {
  const {method, url} = req;
  
  if(method === 'GET' && url === '/user'){
    req.end('USERINFO');
  }  
});
// Express.js 를 사용하는 경우

const express = require('express');
const app = express();

app.get('/user', (req, res) => {
  req.send('USERINFO');
});

// 위와 동일한 작동을 한다.

응답 전달하기

  • Express.js 에서는 .write(), .end() 가 아닌 .send() 혹은 .json() 을 사용한다.
    .send()Content-Type 을 자동으로 지정해 준다는 특징이 있다.
  • Express.js 에서 .end() 는 잘 안쓴다.
    → 대신 .send().json() 을 자주 사용하며, .end() 의 경우 응답코드 404등을 전달할 때 아무런 내용을 넣지 않고자 할 때 사용되지만, .send() 도 동일한 역할을 하기 때문에 잘 사용되지 않는다.

https://yohanpro.com/posts/nodejs/express-response
→ 참고 블로그

미들웨어

  • 미들웨어란, 사전적의미로 운영체제와 소프트웨어 사이에서 실행되는 프로그램이라는 뜻을 가진다.
  • Express.js에서는 요청과 응답의 중간에 위치하는 일종의 라이브러리(함수)를 의미한다.
    → 요청을 받아서 미들웨어로 처리하여 응답을 보낸다.
  • 요청이 들어오면 미들웨어가 해당 요청을 이용하여 동작을 수행하고, 응답 과정에서 작동에 대한 결과를 전송한다.

미들웨어 불러오기

  • 필요한 미들웨어를 npm 을 이용하여 설치하고 변수에 할당하거나, 원하는 미들웨어를 직접 작성하여 사용 할 수 있다.
  • 이때 외부 라이브러리로 설치한 미들웨어require 문법으로 문서로 불러와 사용한다.
const express = require('express');
const app = express();

const cors = require('cors') 
// cors 미들웨어를 변수에 지정한다.

미들웨어 작성

  • 통과 케이스와 에러케이스를 나누어야 한다.
  • 통과케이스인 경우 next()다음 미들웨어가 실행되거나, 응답을 전달 할 수 있도록 해주어야한다.
  • 만약 에러라면 req.send(’err’) 등으로 다음 미들웨어로 넘어가지 않고 중간 단계에서 에러에 대한 응답을 처리해야한다.
const express = require('express');
const app = express();

const testMdware = app.get(req, res, next) {
  if(err){
    res.send('Error!') // 에러가 있는 경우 에러 케이스로 종료한다.
  }
  next() // 에러가 없는 경우 다음 미들웨어를 부르거나, 응답을 전달한다.
}

미들웨어 적용

  • 원하는 요청에만 사용할 경우, 사용할 요청의 두번째 인자로 사용할 미들웨어를 입력하면 된다.
const express = require('express');
const app = express();

const testMdware = app.get(req, res, next) {
  if(err){
    res.send('Error!')
  }
  next()
}

app.get('/', testMdware, (req, res) => {
  req.send('hi')
})
  • app.use(사용할 미들웨어) 를 사용하면, 모든 요청에 대해서 미들웨어를 실행한다.
const express = require('express');
const app = express();
const cors = require('cors')

app.use(cors) // 모든 요청에 대해 해당 미들웨어를 적용한다.

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

요청의 payload 불러오기

  • 기존의 경우 요청의 payload 를 불러오기 위해선 .on이벤트를 이용하여 버퍼로 받아 문자열로 바꾸는 방법을 사용했다.
// http 객체 이용

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString(); // 문자열로 바꾸기
});
  • Express.js 는 자체적으로 요청의 payloadJSON의 형식으로 가져오는 Body-parser 미들웨어를 내장한다.
  • 다른 미들웨어를 불러오는 것 처럼 require 문법을 사용하지는 않으며, express.json(실행옵션)변수에 지정하고, 전역으로 사용(app.use())하거나, 원하는 요청에만 사용 할 수 있다.
  • 이 때 요청의 payloadJSON의 형태로 전달되며, 객체 혹은 배열의 형태로만 전달 될 수 있다.(일단은)
  • 이때, express.json({strict : false}) 로 해당 미들웨어를 불러오게 되면, 미들웨어의 실행옵션 중 strict 옵션을 false로 바꾼다는 뜻이 되며, 이 경우 배열과 객체가 아닌 일반 문자열도 전달할 수 있다.
    → 비구조화 할당.
  • 이렇게 설정했다면 요청의 payload.body를 이용하여 불러 올 수 있다.
const express = require('express');
const app = express();
const bodyParser = express.json({strict : false}) 
// Body-parser 미들웨어를 불러온다.
// strict 설정을 false로 변경한다.

app.use(bodyParser)

app.post('/newpost', (req, res) => {
  res.json(req.body.toUpperCase())
  // payload를 대문자로 변경하는 간단한 예제
  // req.body 로 payload 를 불러온다.
})

query? params?

query

  • req.query 로 가져 올 수 있으며, URI 에 포함된 query정보를 가지는 파라미터이다.
http://somesite.com/home?a=hello&b=mynameis&c=kr
// 일때,

req.query.a // 'hello' 
req.query.b // 'mynameis'
req.query.c // 'kr'

// query의 값은 위와 같다.

params

  • req.params 로 가져 올 수 있으며, URI에 포함된 매개변수 값(params)을 가지는 파라미터이다.
// http://somesite.com/userinfo/:username
// :username 이라는 매개변수를 받는다고 가정한다.

http://somesite.com/userinfo/krock
// 일때,

req.params.username // krock

// params의 값은 위와 같다.

0개의 댓글