Node.js 환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 프레임워크
npm install express
npm으로 express 프레임워크를 사용할 수 있다.
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello world')
})
app.listen(port, () => {
console.log(`{port} port is activating`)
})
node.js에서는 createServer를 사용하여 서버를 만들었지만, express에서는 express() 함수를 활용하여, 각 메소드 별로 응답을 보낼 수 있다.
const express = require('express');
const router = express.Router();
router.get('/lower', (req, res) => {
res.send(req.body.toLowerCase());
})
Express에서 자체 제공하는 Router 기능은 메소드와 url로 분기점을 만드는 것을 말한다.
단순히 봤을 때는 그냥 express()를 사용해서 서버를 만드는 것과 큰 차이가 없어 보인다.
하지만, 분기가 많아질 경우에는 상황이 달라진다.
상황별로 분기를 만들어 어떤 메소드와 url이 요청으로 왔을 때, 수행할 작업을 설정할 수 있다.
만약, 항공편 예약 서버를 만든다고 했을 때,
// ./router/flightRouter.js
const { findAll, findById, update } = require('../controller/flightController');
const express = require('express');
const router = express.Router();
router.get('/', findAll);
router.get('/:uuid', findById);
router.put('/:uuid', update);
module.exports = router;
이렇게 항공편과 관련된 요청에 대한 따로 만들어놓고,
// ./app.js
const flightRouter = require('./router/flightRouter');
app.use('/flight', flightRouter);
use 메소드를 활용하여 /flight url이 들어왔을 때, 아까 만들었던 flightRouter로 가서 상황에 맞게 처리할 수 있게 해준다.
Express의 가장 큰 장점 중 하나는 미들웨어를 사용할 수 있다는 것이다.
여기서 미들웨어란,
요청 오브젝트(req), 응답 오브젝트 (res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수라고 Express 공식문서에 정의되어 있다.
즉, 말그대로 프로세스 중간에 관여하여 특정 역할을 수행하는 것을 말한다.
만약, 모든 요청에 대해서 동일한 미들웨어를 적용하고 싶을 땐 어떻게 해야할까?
모든 요청에 대해 LOGGED가 출력되는 미들웨어를 적용한다고 했을 때,
const express = require('express');
const app = express();
const myLogger = (req, res, next) => {
console.log('LOGGED');
next();
};
app.use(myLogger);
app.get('/', (req, res) => {
res.send('Hello World');
});
app.listen(3000);
다음과 같이 구현할 수 있다.
미들웨어는 항상 req, res, next를 인자로 받고
이 때, next는 다음 미들웨어를 실행하는 메소드이다.
미들웨어를 사용하는 경우는 다음과 같다.
미들웨어로 Node.js에서 번거로웠던 작업들을 훨씬 편하게 할 수 있다.
node.js에서 요청객체의 body를 가져오는 것은 쉽지않고, 번거롭다.
이 때, body-parser 미들웨어를 사용하면 쉽게 해결할 수 있다.
Express v4.16.0 이후 부터는 따로 설치할 필요없이, 내장 미들웨어인 express.json()을 사용하면 된다.
const jsonParser = express.json();
app.json('/api/users', jsonParser, function (req, res){
res.send(req.body);
})
위의 코드에서 jsonParser의 역할은 req객체의 body에 바로 접근하여 데이터를 가져올 수 있게 해준다.
만약, jsonParser를 사용하지 않았을 경우 body에 접근할 수 없다.
만약, express.json() 미들웨어 사용에 에러가 발생한다면, json()의 옵션이 원인일 수 있다.
express.json()의 옵션 중 strict의 default값은 true이다.
즉, 엄격하게 검증하기 때문에 req의 body가 객체나 배열이 아닐 경우에는 에러가 발생하게 된다.
우리는 이 문제를 해결하기 위해서
express.json({strict: false})
이렇게 설정해주면 된다.
node.js에서 cors설정을 응답 헤더에 전달하기 위해
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
if (req.method === 'OPTIONS') {
res.writeHead(201, defaultCorsHeader);
res.end()
}
이렇게 긴 코드를 적어야했다.
cors미들웨어를 사용하면, 간편하게 해결할 수 있다.
npm install cors
npm으로 cors 미들웨어를 설치해주고,
const cors = requiee('cors');
app.use(cors());
이렇게 해주면, 모든 요청에 대해 CORS를 허용해준다.
만약, 특정 요청에 대해서만 CORS를 허용하고 싶다면,
const cors = require('cors');
app.get('/products/:id', cors(), function (req, res, next) {
...
})
이렇게 하면, 해당 요청에 대해서만 CORS를 허용하게 된다.