MERN stack은 JavaScript 생태계에서 인기있는 프레임워크인 MongoDB, Express, React, Node를 지칭한다.
이 중 Express.js는 Node.js환경에서 웹 서버, 또는 API 서버를 제작하기 위해 사용되는 인기있는 프레임워크다.
Express로 구현한 서버가 http 모듈로 작성한 서버와 다른 점은 2가지가 있다.
메소드와 URL( /lower, /upper 등)로 분기점을 만드는 것을 라우팅(routing)이라고 한다.
클라이언트는 특정한 HTTP 요청 메소드(GET, POST 등)나 서버의 특정 URI (또는 경로)로 HTTP 요청을 보낸다. 라우팅은 클라이언트의 요청에 해당하는 메소드와 Endpoint에 따라 서버가 응답하는 방법을 결정하는 것이다.
Express는 프레임워크 자체에서 라우터 기능을 제공한다. 그래서 순수한 node.js코드로 작성한 코드보다 Express의 라우터를 활용하면 더 직관적인 코드를 작성할 수 있다.
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED'); // 이 부분을 req, res 객체를 이용해 고치면, 모든 요청(req 입력시), 응답(res 입력시)에 대한 로그를 찍을 수 있다.
next();
};
app.use(myLogger);//모든 요청에 동일한 미들웨어(여기 예시에서는 'LOGGED'를 콘솔에 찍어내는 logger를 의미)를 적용할 때 app.use를 사용하면 된다.
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
const bodyParser = require('body-parser')
const jsonParser = bodyParser.json()
// 생략
app.post('/api/users', jsonParser, function (req, res) {
// req.body에는 JSON의 형태로 payload가 담겨져 있다.
})
순수 node.js 코드에 CORS 헤더를 붙이려면, 응답 객체의 writeHead메소드 등을 이용한다. 그러나, cors 미들웨어를 사용하면 간단하게 처리할 수 있다.
모든 요청에 대해 CORS허용 시,
const cors = require('cors')
// 생략
app.use(cors()) // 모든 요청에 대해 CORS 허용
const cors = require('cors')
// 생략
// 특정 요청에 대해 CORS 허용
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
app.use((req, res, next) => {
if(req.headers.token){
req.isLoggedIn = true;
next()
} else {
res.status(400).send('invalid user')
}
})