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 |