Routing
- 클라이언트의 요청을 미들웨어로 분배
app.all(path,callback)
app.get(path,callback)
app.post(path,callback)
app.put(path,callback)
app.delete(path,callback)
- 동적 Parameter :
app.get('/user/:item',callback)
- Parameter 얻기 :
req.params.item
app.get('/user:id',function(req,res){
var userId = req.params.id;
})
app.get('/movies/:movieid/:actor',function(req,res){
var movieid = req.params.movieid;
var actor = req.params.actor;
})
- 동적 Parameter의 순서가 중요 ( item때문에 sample을 처리 불가 )
/user/:item
/user/sample
정규식 사용하기
?
: 문자 존재하거나 생략+
: 1번 이상 반복*
: 임의의 문자
// /abcd, /acd
app.get('ab?cd',function(req,res){});
// /abcd, /abbcd, /abbbcd
app.get('ab+cd',function(req,res){});
// /abcd, /abxcd, /abRABODMDOFMDFcd, /ab123cd
app.get('ab*cd',function(req,res){});
// /abe, /abcde
app.get('ab(cd)?e',function(req,res){});
Route 함수
app.route('/book')
.get(function(req,res){
})
.post(function(req,res){
})
Router 수준의 Middleware
express.Router
- Routing Logic을 별도로 분리 가능
- 상대 경로 요청 처리 가능
- 수정이 쉽다.
Error Middleware
Middleware 내부에서 처리
- 각각 미들웨어에서 에러 처리
- 에러 처리 로직이 제각각
- 에러 처리 코드 중복
Error Handler Middleware에게 위임
- 일관된 에러 처리 가능
- Error Handler Middleware는 Middleware 중 후순위
Error Parameter
app.use(function(err,req,res,next){
var error = new Error("ERROR MESSAGE");
error.code = 100;
return next(error);
})
환경 별 에러 처리
// Window
set NODE_ENV=product
node myapp.js
// Linux
$ NODE_ENV=product node myapp.js
$ NODE_ENV=development node myapp.js
app.get('env')
if(app.get('env') === 'development'){ //개발 설정
}
else{ // product
}
Third Party Middleware
Favicon Middleware
serve-favicon
npm install serve-favicon
favicon(path, options)
- 앞 순위에 배치하여 처리한다.
var express = require('express');
var favicon = require('serve-favicon');
var app = express();
app.use(favicon(__dirname + '/public/favicon.ico'));
Log Middleware
morgan
npm install morgan
var express = require('express');
var morgan = require('morgan');
var app = express();
app.use(morgan('dev')); // dev 로그 포맷
app.get('/hello', function (req, res) {
res.send('GET request, /');
});
app.get('/movies', function(req, res) {
res.send('GET request, /movies');
});
app.listen(3000);
winston
: 다양한 로그 포맷, email, sms, 파일, db에 저장npm install winston
-
Transport를 활용하여 Output 설정
- 별도 설치 transports
DailyRotateFile
CouchDB,Redis,MongoDB
Mail transport
Notification Service
var winston = require('winston');
winston.info('INFO message');
winston.warn('warn message');
winston.add(winston.transports.File,filename);
winston.remove(winston.transports.Console);
winston.add(require('winston-daily-rotate-file'),{datePattern:'yyyyMMdd'},filename);
BodyParser Middleware
npm install body-parser
- JSON, RAW, TEXT, URL-Encoded
- Multipart 지원 X
JSON
- options
inflate
: 압축된 메시지 바디 다루기limit
: 바디 메시지 크기.strict
: JSON 구조의 배열이나 객체만 접수app.use(BodyParser.json())
URL-Encoded
- options
extended
: queryString으로 파싱parameterLimit
: parameter 개수 제한inflate, limit
: JSON과 동일app.use(bodyParser.urlencoded({extended:false}));
Parser Result
var title = req.body.title;
var message = req.body.message;
Method Override
npm install method-override
- HTML에서 GET/POST만 가능
- Get/Post말고 Put/Delete등 다른 Method를 사용하기 위한 기능
POST /?resource_method=DELETE
사용법
app.use(methodOverride('_method'));