Express란?
Express는 Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기 있는 프레임워크
(다른 프레임워크로는 MERN stack이라 불리는 MongoDB, Express, React, Node.js가 있다.)
Express는 라우터와 미들웨어라는 기능이 장점이다
사용법
설치하기
npm install express
간단히 만드는 Express 서버 코드
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
핵심기능
1. 라우팅
URI(또는 경로) 및 특정한 HTTP 요청 메소드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 애플리케이션이 응답하는 방법을 결정하는 것
app.METHOD(PATH, HANDLER)
예제
// /user 라우트에 대한 응답
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.post('/', function (req, res) {
res.send('Got a POST request');
});
app.put('/user', function (req, res) {
res.send('Got a PUT request at /user');
});
app.delete('/user', function (req, res) {
res.send('Got a DELETE request at /user');
});
2. 미들웨어
미들웨어란?
요청 오브젝트(req),응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수 대한 액세스 권한을 갖는 함수
미들웨어는 말 그대로 프로세스 중간에 관여하여 특정 역할을 수행
미들웨어를 사용하는 상황
- POST 요청 등에 포함된 body(payload)를 구조화할 때(쉽게 얻어내고자 할 때)
- 모든 요청/응답에 CORS 헤더를 붙여야 할 때
- 모든 요청에 대해 url이나 메서드를 확인할 때
- 요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
POST 요청 등에 포함된 body(payload)를 구조화
Node.js로 HTTP body(payload)를 받을 때에는 Buffer를 조합해서 다소 복잡한 방식으로 body를 얻을 수 있습니다. 네트워크 상의 chunk를 합치고, buffer를 문자열로 변환하는 작업이 필요하지만
Express에서는 간단하게 사용 가능
npm install body-parser
const jsonParser = express.json();
app.post('/api/users', jsonParser, function (req, res) {
})
const jsonParser = express.json({strict: false});
// strict:false를 쓰는 이유는 기본적으로 true값을 받는데 배열과 객체만 전달받을 수 있고
// false인 경우는 모든 타입을 받을 수 있다.
app.post('/api/users', jsonParser, function (req, res) {
})
모든 요청/응답에 CORS 헤더를 붙여야 할 때
Node.js HTTP 모듈을 이용한 코드에 CORS 헤더를 붙이려면, 응답 객체의 writeHead 메서드를 이용할 수 있습니다. Node.js에서는 이 메서드 등을 이용하여 라우팅마다 헤더를 매번 넣어주어야 합니다. 그뿐만 아니라, OPTIONS 메서드에 대한 라우팅도 따로 구현해야 하지만
Express에서는 간단하게 사용 가능
npm install cors
// 모든 요청에 대한 허용
const cors = require('cors');
app.use(cors());
// 특정 요청에 대한 허용
const cors = require('cors')
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
모든 요청에 대해 url이나 메서드를 확인할 때
모든 요청에 대해 메서드와 url을 출력 예시
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
//req를 활용합니다.
next();
};
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
요청 헤더에 사용자 인증 정보가 담겨있는지 확인할 때
HTTP 요청에서 토큰이 있는지를 판단하여, 이미 로그인한 사용자일 경우 성공, 아닐 경우 에러를 보내는 미들웨어 예제
(토큰(Token): 주로 사용자 인증에 사용)
app.use((req, res, next) => {
// 토큰이 있는지 확인, 없으면 받아줄 수 없음.
if(req.headers.token){
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user')
}
})