* 위 내용을 정리하였음
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');
- 이렇게 메서드 체이닝을 통해 코드양을 줄일 수 있다.
'ComputerScience > NodeJs' 카테고리의 다른 글
node - 6.5 템플릿 엔진 사용하기(nunjucks) (0) | 2022.01.28 |
---|---|
node - 6.5 템플릿 엔진 사용하기(pug) (0) | 2022.01.28 |
node - 6.2 자주 사용하는 미들웨어 (0) | 2022.01.23 |
node - 6 Express로 웹 서버 만들기 (0) | 2022.01.22 |
node - 5 Package Manager (0) | 2022.01.15 |