본문 바로가기

ComputerScience/NodeJs

node - 6.3 Router 객체로 라우팅 분리 ~ 6.4 req, res 객체

728x90
 

더북(TheBook): Node.js 교과서 개정 2판

 

thebook.io

* 위 내용을 정리하였음

6.3 Router 객체로 라우팅 분리하기

- 4.2절에서 만들었던 라우터는 if분기 때문에 지저분 했다.

const app = express();

app.get('/upload', (req, res) => {
  res.sendFile(path.join(__dirname, 'multipart.html'));
});

- 여기에 app.get이 라우터이다.

- 라우터를 추가할수록 app.js가 길어지니까 express를 이용해서 깔끔하게 분리해보자.

// routes/index.js

const express = require('express');

const router = express.Router();

// GET / 라우터
router.get('/', (req, res) => {
  res.send('Hello, Express');
});

module.exports = router;
// routes/user.js

const express = require('express');

const router = express.Router();

// GET /user 라우터
router.get('/', (req, res) => {
  res.send('Hello, User');
});

module.exports = router;

- 이렇게 만든 index.js, user.js를 app.js에 app.use를 통해 연결한다.

const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();
const indexRouter = require('./routes');
const userRouter = require('./routes/user');

const app = express();
app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie',
}));

app.use('/', indexRouter);
app.use('/user', userRouter);

app.use((req, res, next) => {
  res.status(404).send('Not Found');
});

app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

- 여기서 중요한 부분만 떼서 다시 보자

    ...
    
dotenv.config();
const indexRouter = require('./routes');
const userRouter = require('./routes/user');

const app = express();
app.set('port', process.env.PORT || 3000);

     ...

app.use('/', indexRouter);
app.use('/user', userRouter);

app.use((req, res, next) => {
  res.status(404).send('Not Found');
});

app.use((err, req, res, next) => {
  console.error(err);
  res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});

- ./routes/index가 아니라 ./routes만 해도 되는 이유는 index.js를 생략할 수 있기 때문이다.

- 이 두 라우터는 서로 다른 주소의 라우터 역할을 한다.

- 하나는 GET /라우터 다른 하나는 GET /user 라우터가 되었다.

router.get('/', function(req, res, next) {
  next('route');
}, function(req, res, next) {
  console.log('실행되지 않습니다');
  next();
}, function(req, res, next) {
  console.log('실행되지 않습니다');
  next();
});


router.get('/', function(req, res) {
  console.log('실행됩니다');
  res.send('Hello, Express');
});

- 첫번째 라우터에서 바로 next('route')를 호출하기 때문에 뒤에 있는 미들웨어는 건너뛰고 동일한 주소의 다음 라우터로 넘어간다.

router.get('/user/:id', function(req, res) {
  console.log(req.params, req.query);
});

- 이런식으로 정규표현식을 사용할 수 있다.

- /user/1, user/123, user/like등의 요청도 이 라우터가 처리할 수 있게 된다.

- :id값을 req.params로 조회할 수 있다. 

router.get('/user/:id', function(req, res) {
  console.log('얘만 실행됩니다.');
});
router.get('/user/like', function(req, res) {
  console.log('전혀 실행되지 않습니다.');
});

- 이런패턴은 보통 다른 라우터를 방해하지 않도록 일반 라우터보다 뒤에 위치하도록 한다.

- /users/123?limit=5&skip=10이라는 주소의 요청이 들어왔을 때 req.params req.query 객체는 다음과 같다.

{ id: '123' } { limit: '5', skip: '10' }
router.get('/abc', (req, res) => {
  res.send('GET /abc');
});
router.post('/abc', (req, res) => {
  res.send('POST /abc');
});

- 다음처럼 묶어서 사용할수도 있다.

router.route('/abc')
  .get((req, res) => {
    res.send('GET /abc');
  })
  .post((req, res) => {
    res.send('POST /abc');
  });

6.4 req, res 객체 살펴보기

 req.app: req 객체를 통해 app 객체에 접근할 수 있다. req.app.get('port')와 같은 식으로 사용할 수 있다.

 req.body: body-parser 미들웨어가 만드는 요청의 본문을 해석한 객체

 req.cookies: cookie-parser 미들웨어가 만드는 요청의 쿠키를 해석한 객체

 req.ip: 요청의 ip 주소가 담겨 있다.

 req.params: 라우트 매개변수에 대한 정보가 담긴 객체.

 req.query: 쿼리스트링에 대한 정보가 담긴 객체

 req.signedCookies: 서명된 쿠키들은 req.cookies 대신 여기에 담겨 있다.

 req.get(헤더 이름): 헤더의 값을 가져오고 싶을 때 사용하는 메서드

 

 res.app: req.app처럼 res 객체를 통해 app 객체에 접근할 수 있다.

 res.cookie(키, 값, 옵션): 쿠키를 설정하는 메서드.

 res.clearCookie(키, 값, 옵션): 쿠키를 제거하는 메서드.

 res.end(): 데이터 없이 응답을 보냄.

 res.json(JSON): JSON 형식의 응답을 보낸다.

 res.redirect(주소): 리다이렉트할 주소와 함께 응답을 보낸다.

 res.render(뷰, 데이터): 다음 절에서 다룰 템플릿 엔진을 렌더링해서 응답할 때 사용하는 메서드.

 res.send(데이터): 데이터와 함께 응답을 보낸다. 데이터는 문자열일 수도 있고 HTML일 수도 있으며, 버퍼일 수도 있고 객체나 배열일 수도 있다.

 res.sendFile(경로): 경로에 위치한 파일을 응답.

 res.set(헤더, 값): 응답의 헤더를 설정.

 res.status(코드): 응답 시의 HTTP 상태 코드를 지정

 

res
  .status(201)
  .cookie('test', 'test')
  .redirect('/admin');

- 이렇게 메서드 체이닝을 통해 코드양을 줄일 수 있다.

728x90
반응형