바르고 뜨겁게
[NodeJS] express 프레임워크 본문
express - app.js
요청(req) >> 미들웨어(app.use 형태) >> 응답(res)
next()
도 하지않고res
응답도 하지 않으면 클라이언트는 무한정으로 기다린다.라우터기능
app.js
는 쉽게말하면 중앙 통제를 하는 파일로, 라우터들을 연결한다.app.get('/users', (req,res)=>{
res.send('유저 정보');
});
익스프레스 설정, 값 저장
app.set
미들웨어(middleware) 장착
app.use
: 모든경우 적용 /app.get
app.post
... : 특수한 경우 적용app.use
안의 req, res로 요청과 응답을 조작할 수 있다. req, res는 모든 미들웨어를 차례대로 거쳐간다다음 미들웨어로 넘어가기 위해선
next()
를 호출하거나res.send
로 응답을 보내야한다.next가 없는데 넘어가는 경우? ... 선언된 함수내에 내장되어있다.
res.send
==res.status(200).send()
: status(200) 은 생략 가능하다next()
를 하면 다음 미들웨어로 넘어가지만,res.send
로 응답을하면 다음미들웨어로 넘어가지 않고 리턴되고 끝이난다.app.use((res,req, next)=>{
console.log('첫번째 미들웨어');
next();
});
app.get('/',(req,res)=>{
console.log('세번째 미들웨어');
res.send('Hello middleware')
});
// 바로 위 미들웨어에서 next가 없으므로 호출되지 않음
app.get('/users',(req,res)=>{
console.log('네번째 미들웨어');
res.send('Hello users');
});첫번째 미들웨어
두번째 미들웨어
세번째 미들웨어
라우팅 미들웨어
app.get
app.post
...http요청의 주소에 따라 일치되는 경우에만 동작되는 미들웨어
'/users'
형태로 특수한 경우에만 동작 됨app.get('/users',(req,res)=>{
console.log('네번째 미들웨어');
res.send('Hello users');
});
라우터 분리 (
app.js
가 복잡해지니까routes
폴더에 라우터들을 따로 빼서 모듈화 한다.)app.js
의 경로와routes/index.js
의 경로가 합쳐진다app.js
const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
app.use('/', indexRouter);
app.use('/users', usersRouter);routes/index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;routes/users.js
var express = require('express');
var router = express.Router();
// app.js 경로랑 합쳐짐
// GET /users/
router.get('/',(req,res)=>{
res.send('Hello users');
});
module.exports = router;
유용한 미들웨어
const logger = require('morgan');
: 요청과 응답에 대한 로그 ( 응답후에 로그가 찍힘 )app.use(logger('dev'));
express 내장 미들웨어
req.on('data')
,req.on('end')
를 해석하는 용도app.use(express.json());
app.use(express.urlencoded({ extended: false }));정적 파일 라우터 ( public 폴더안에 있는 정적 파일을 가져옴 )
파일이 없을때만 next 됨.
app.use(express.static(path.join(__dirname, 'public')));
const cookieParser = require('cookie-parser');
:쿠키활성화 - 서버가 저장한 쿠키인지, 위조되 쿠키인지 판별
app.use(cookieParser('secret code'));
const session = require('express-session');
: 메모리 세션 활성화resave : 세션객체에 수정사항이 없어도 저장을 할지 여부
saveUninitialized : 처음에 빈 세션을 저장 할지 여부
app.use(session({
resave: false,
saveUninitialized: false,
secret: 'secret code',
cookie:{
httpOnly:true,
secure: false
}
}));const flash = require('connect-flash');
: 1회성 alert 메시지 표시
404 처리 미들웨어와 에러 처리 미들웨어
next
도 하지않고res
응답도 하지 않으면 클라이언트는 계속 기다리게 됨404 NOT FOUND 처리 ( ex:요청에 대한 값이 라우터에 없는 상태) - 클라이언트 에러
app.use((req, res, next)=>{
res.status(404).send('NOT FOUND');
});500 에러 처리 - 서버 에러
routes/index.js
router.get('/',(req,res,next)=>{
console.log('세번째 미들웨어');
//res.send('Hello middleware')
try{
throw new Error('임의 서버 에러')
}catch( error ){
next(error);
}
});app.js
app.use(function(err, req, res, next){
console.log(err);
res.stauts(500).send('SERVER ERROR');
});
파일 불러오기
HTML
router.get('/',(req,res,next)=>{
console.log('세번째 미들웨어');
res.sendFile('html 파일경로');
});템플릿 뷰 엔진
router.get('/',(req,res,next)=>{
console.log('세번째 미들웨어');
res.render('파일 경로'); //views 까진 자동으로 들어감
});
미들웨어->템플릿엔진 변수 선언
템플릿 엔진에 렌더링 되는 변수를 app.js 에서 선언가능
아래 처럼 하면 다른 미들웨어에서 선언이 불가능
res.render('error',{ message: '메시지변수', error: '에러변수'});
아래 처럼 하면 다른 미들웨어에서 선언 하더라도 템플릿 뷰 엔진에서 사용가능하다.
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
express 에서 변수 공유 , 미들웨어간 변수 공유
app.set('키값','값');
app.get('키값'); // 값 반환라우터에선 app 이라는 변수가 없기때문에 아래 처럼 사용
req.app.get('키값');
app.
은 모든 요청에서 공유되기 때문에 특정 요청 에서만 값을 저장하고 싶다면 아래 처럼 사용req,'키값' = '값';
req.'키값' // 값 반환
기타
app.use(express.json());
아래 처럼 쓸 수 있다.
app.use((req, res, ext)=>{
express.json()(req, res, next);
});
'자바스크립트 > Node Js' 카테고리의 다른 글
[nodeJS] 시퀄라이즈(sequelize) (0) | 2019.01.21 |
---|---|
[NodeJS] 템플릿 뷰 엔진 PUG (0) | 2019.01.11 |
[NodeJS] npm 명령어, 생성, 설치, 배포 (0) | 2018.12.29 |
[NodeJS] 노드JS로 서버 만들기 (0) | 2018.12.27 |
[NodeJS] 예외처리 (0) | 2018.12.27 |