본문 바로가기

Node/Node.js교과서

[Node] express -3

Router 객체 사용하여 라우터들 분리하기

 

app.js 파일을 하나만 사용하다보면 코드가 복잡해지는것을 막을수가없다.

그리하여 Router들을 uri에 맞춰 구분해주기로 한다. 

(Spring 사용시 Controller들을 페이지종류별로 분류하여 사용하듯)

 

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;

app.js

...(생략)
const path = require('path');

dotenv.config();

const indexRouter = require('./routes');
const userRouter = require('./routes/user');
...(생략)
 name: 'session-cookie',
 }));
 
 app.use('/', indexRouter);
 app.use('/user', userRouter); // userRouter의 get은 /user 와 / 가 합쳐져서 get /user/가 된다
 
 app.user((req, res, next) =>{
  res.status(404).send('Not Found');
 });

 

라우트 매개변수

:id 를 넣으면 req.params.id로 받을수가 있다. >> 동적으로 변하는 부분을 라우트 매개변수로 만드는것

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

// 일반 라우터보다 뒤에 위치해야한다. 아래는 해당 예시
router.get('/user/:id', function(req,res){
 console.log('먼저 실행됩니다');
});
router.get('/user/like', function(req,res){
 console.log('이 부분은 실행되지 않습니다.');
});

 404 미들웨어

요청과 일치하는 라우터가 없는 경우를 대비해 404 라우터를 만들어야한다.

//해당 처리가 없을 경우 단순하게 Cannot Get 주소 라는 문자열이 표시될것이다.
app.use((req, res, next)=> {
 res.status(404).send('Not Found');
});

라우터 그룹화 

- 주소는 같지만 메서드가 다른 코드가 있을때

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

//router.route()로 묶음
router.route('/abc')
 .get((req,res) = >{
  실행 내용
 })
 .post((req,res) =>{
  실행 내용 
 });

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(경로): 경로에 위치한 파일을 응답  (Spring에서 String, ModelAndView로 응답할 파일 지정과 유사 )

***

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

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

메서드 체이닝을 지원한다

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

 

에러처리 미들웨어

에러 발생시 템플릿 엔진과 상관없이 템플릿 엔진 변수를 설정하고 error 템플릿을 렌더링한다.

- res.locals.변수명 으로 템플릿 엔진 변수 생성 가능

- process.env.NODE_ENV 는 개발환경인지 배포환경인지 구분해주는 속성이다.

...
app.use((req, res, next) => {
 const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
 error.status = 404;
 next(error);
});

app.use((err, req, res, next) =>{
 res.locals.message = err.message;
 res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
 res.status(err.status || 500);
 res.render('error');
});

 

'Node > Node.js교과서' 카테고리의 다른 글

[Node] sequelize  (0) 2023.05.22
[Node] express -2  (0) 2023.05.19
[Node] express -1  (0) 2023.05.04