Node
Node.js 서버 생성하기 (with express)
citron031
2023. 1. 21. 14:44
Node.js 환경에서 Express.js는 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기 있는 프레임워크이다.
http 모듈로 만드는 대신에 express를 사용하여 서버를 만들면, 미들웨어의 추가가 편하고, 자체 라우터를 제공한다.
이를 통해서 express로 더 쉽게 웹 서버를 만들 수 있다.
🥭 npm init으로 시작할 수 있다.
🥭 npm i express로 설치할 수 있다.
express 역시 내부적으로는 노드의 http 모듈을 사용하고 있다.
Nest.js도 내부적으로는 express를 사용한다고 하니, express는 node 백엔드 개발자라면 알아두어야 할 라이브러리이다.
🍏 npm install express 를 통해서 express를 설치해 사용할 수 있다.
express의 공식문서
https://expressjs.com/ko/starter/hello-world.html
를 참고하여 간단한 서버를 만들 수 있다.
서버를 실행하는 방법은 node 파일.js 를 통해 실행한다.
Express "Hello World" 예제
Hello world 예제 기본적으로 이 앱은 여러분이 작성할 수 있는 가장 간단한 Express 앱일 것입니다. 이 앱은 하나의 파일로 된 앱이며 Express 생성기를 통해 얻게 되는 앱과는 같지 않습니다. (이 예제
expressjs.com
const express = require('express');
const app = express();
// 위의 코드로 express를 불러오고 express로 서버를 만든다.
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
/*
서버를 키고 설정된 3000번 포트의 '/' endpoint에
웹 브라우저로 접속할 시 Hello Wolrd 를 response한다.
*/
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
메소드와 URL을 통해서 라우터 구현
- express는 프레임워크 자체에서 편리하게 사용할 수 있는 라우터 기능을 제공한다.
- 기존에 if else문을 사용하는 것 보다 더 간편하게 사용할 수 있다.
const router = express.Router();
// 라우터 기능을 사용한다.
router.get('/lower', (req, res) =>{
res.send(data);
})
// get이외에도 post, delete, put등을 사용할 수 있다.
Middleware
미들웨어를 통해서 간편하게 request에 필요한 기능을 추가하거나, 에러를 탐지할 수 있다.
미들웨어의 구성
const app = express();
app.get('/', function(req, res, next){
next();
});
- 메소드를 사용하고, 인자로 경로와 미들웨어 함수를 받는다.
- 미들웨어 함수의 인자로는 순서대로 미들웨어 함수에 대한 요청(req), 응답(res), 콜백 인수(next)이다.
- next를 통해서 다음 미들웨어 함수를 실행한다.
- 특정 endpoint 경로가 아니라 모든 요청에 동일한 미들웨어 함수를 적용하고자 한다면, 매소드 app.use()를 사용한다.
자주 사용되는 Middleware들
모든 요청의 url과 매소드를 확인하기
const myLogger = function (req, res, next) {
console.log("http request method : " + req.method
+ ", url :" + req.originalUrl);
next();
};
app.use(myLogger);
/*
이렇게 로그 기능을 추가하여,
모든 요청에 대해서 매소드와 url을 확인할 수 있다.
*/
POST 요청 등에 포함된 body(payload)를 구조화하기
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
app.use(express.json({strict: false}));
app.post('/upper', jsonParser, function (req, res) {
// req.body에는 JSON의 형태로 payload가 담겨져 있습니다.
res.send(req.body.toUpperCase());
// 요청에서 받은 body의 내용을 대문자로 하여 응답한다.
})
- body-parser 미들웨어를 통해서 네트워크상의 chunk를 합치고, buffer를 body로 변환하는 작업을 간편할 수 있다.
- 위와 같이 body-parser 미들웨어를 사용하여 쉽게 요청에 포함된 body를 받을 수 있다.
- body-parser 미들웨어를 사용하기 위해서 npm install body-parser로 설치한다.
- app.use(express.json({strict: false})); 를 통해서 배열과 객체뿐만 아니라 JSON.parse()할 수 있는 모든 변수를 받아들인다.
- 만약 app.use(express.json({strict: false}));가 없고, request 헤더에 'Content-Type': 'application/json'이 설정되어 있다면, POST로 text가 왔을 때, 빈 객체만 반환된다.
- res.send를 통해서 응답에 데이터를 담아 보낼 수 있다.
- res.json에는 res.send가 포함되어 있다.
- res.json은 'Content-Type', 'application/json'을 설정하고, 받은 인자를 JSON으로 변환하여 보낸다.
- JSON 데이터를 보낼 때에는 res.json을 사용한다.
- text로 요청을 할 때는 단순 요청(Simple requests)으로 OPTIONS 매소드 요청이 발생하지 않는다.
- JSON으로 요청하면, preflighted request가 발생한다.
모든 요청과 응답에 CORS 헤더를 붙이기
- cors 미들웨어를 사용하여 쉽게 이를 할 수 있다.
- npm install cors를 통해 설치한다.
const cors = require('cors');
app.use(cors());
// 모든 요청에 대해 CORS를 허용한다.
- 각 경로와 매소드에 따라서 CORS를 허용할 수도 있다.
const cors = require('cors');
// 특정 요청에 대해 CORS 허용
app.get('/lower', cors(), function (req, res, next) {
res.json({name : "John"})
});
요청 헤더에 사용자 인증 정보가 담겨있는지 확인하기
- 로그인 정보(토큰)이 있는지 확인한다.
- 토큰이 없으면, 에러 응답을 한다.
app.use((req, res, next) => {
// 토큰이 있을 때만 진행한다.
if(req.headers.token){
req.isLoggedIn = true;
next()
} else {
res.status(400).send('invalid user')
}
})
🥘 express 버전 4.16 이상에서는 bodyparser가 필요하지 않다. 내부에 해당 기능이 이미 있기 때문이다.
- 4.16 버전 이상에서 req의 body를 가져오기 위해서는 app.use(express.json()); 를 작성한다.
const express = require("express");
const app = express();
app.use(express.json());
🍪 쿠키 사용 설정
app.use(
cors({
origin: "http://localhost:3000",
credentials: true, // 서버와 다른 도메인으로부터 쿠키를 받는다.
})
);
- credentials을 받는 옵션을 설정하면, origin은 *이 될 수 없다. (에러발생)
- ☕️ Access-Control-Allow-Origin 헤더 옵션이 *이 될 수 없다.
- origin을 true로 설정하거나, 요청을 보낼 클라이언트의 주소로 한다.