[Express 프로젝트 생성]
[package.json에 라이브러리 추가하여 설치]
“method-override”:”*”
[app.js]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); // AvILoS - method기능을 추가하기 위하여 methodOverride 연동 var methodOverride = require('method-override'); var routes = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(__dirname + '/public/favicon.ico')); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // AvILoS - method기능을 추가하기 위하여 methodOverride 연동 app.use(methodOverride('_method')); app.use('/', routes); app.use('/users', users); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); module.exports = app; |
[users.js]
– 이 파일에서 사용자 목록 정보를 객체에 로딩해 보관하고, 라우터 레벨 미들웨어를 구성해 라우터를 익스포트 하는 기능을 수행한다.
– GET / POST 한번에 사용하는 방식1
router.use(‘/user/:id’, function(req, res, next) {
console.log(‘Request URL:’, req.originalUrl); next();
}, function (req, res, next) {
console.log(‘Request Type:’, req.method); next();
});
– GET / POST 한번에 사용하는 방식2
router.route(‘/new’)
.get(function(req, res){
res.render(‘users/new’, {title:’사용자 등록’}); })
.post(function(req,res){
});
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | var express = require('express'); var router = express.Router(); // 사용자 목록을 가지고 있는 객체 var users = [ { username: 'gildong', name: '홍길동', bio: '허균소설' }, { username: 'soonshin', name: '이순신', bio: '조선시대의 임진왜란 때 일본군을 물리치는데 큰 공을 세운 명장' }, { username: 'sejong', name: '세종대왕', bio: '한글을 창제한 조선조 제4대 임' } ]; ///* GET users listing. */ //router.get('/', function(req, res, next) { // res.send('respond with a resource'); //}); /* GET users listing */ // Ver 1- Region start // 사용자 목록 요청(GET) //router.get('/', function(req,res,next){ // res.render('users/index', {title:'사용자 관리', users:users}); //}); // //// 사용자 등록 요청(POST) //router.post('/', function(req,res){ // //}); // Region end /* GET users listing */ // Ver 2- Region start // 사용자 목록 요청(GET) router.route('/') .get(function(req,res,next){ res.render('users/index', {title:'사용자 관리', users:users}); }) .post(function(req,res){ users[users.length] = req.body; // 배열에 추가 res.redirect('/users'); // 회원 목록 페이지로 이동 }); // 사용자 등록 폼 요청(GET) router.route('/new') .get(function(req, res){ // users/new.jade파일을 렌더링 res.render('users/new', {title:'사용자 등록'}); }) .post(function(req,res){ }); // Region end // 사용자 리스트 출력 router.get('/list', function(req,res){ res.send('{list:'+JSON.stringify(users)+'}'); }); // 사용자 리스트를 XML파일로 생성하여 렌더링 router.get('/xmllist', function(req,res){ var result = '<?xml version="1.0" encoding="UTF-8"?>\n<rss version="2.0"><list>'; for(index in users){ result += '<item>'; result += '<username>'+users[index].username+'</username>'; result += '<name>'+users[index].name+'</name>'; result += '<bio>'+users[index].bio+'</bio>'; result += '</item>'; } result += '</list></rss>'; res.send(result); }) // 사용자 정보 요청(GET) router.get('/:username', function(req,res){ var user = users[req.params.username]; if(user){ res.render('users/profile', {title:'사용자 프로필', user:user, index:req.params.username}); } }); // 사용자 정보 편집 폼 요청(GET) router.post('/:username/edit', function(req,res,next){ var user=users[req.params.username]; if(user){ console.log('Edit Log => '+req.param('username')+' | '+req.param('name')+' | '+req.param('bio')); console.log('Edit Log => '+req.body); delete users[req.params.username]; // Version 1 //users[users.length] = req.body; // 배열에 매개변수를 통째로 추가 // Version 2 var newUser = { username: req.param('username'), name: req.param('name'), bio: req.param('bio') }; users[users.length] = newUser; // Version 3 //users[req.params.username].username = req.param('username'); //users[req.params.username].name= req.param('name'); //users[req.params.username].bio = req.param('bio'); res.redirect('/users'); }else{ next(new Error(req.params.username+' delete error!')); } }); // 사용자 정보 변경 요청(PUT) router.put('/:username', function(req,res){ }); // 사용자 정보 삭제 요청(DELETE) router.delete('/:username', function(req,res,next){ console.log('delete '+req.params.username); var user=users[req.params.username]; if(user){ delete users[req.params.username]; res.redirect('/users'); }else{ next(new Error(req.params.username+' delete error!')); } }); module.exports = router; |
[views 디렉토리 하위에 users라는 디렉토리 생성후 index.jade, new.jade, profile.jade 3개의 파일 생성]
[index.jade]
1 2 3 4 5 6 7 8 9 10 11 12 13 | // Created by AvILoS on 6/17/15. extends ../layout.jade block content h1= title p a(href="/users/new") 사용자 등록 ul - for(var username in users){ li a(href="/users/"+encodeURIComponent(username))= users[username].name - }; |
[new.jade]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // Created by AvILoS on 6/17/15. extends ../layout.jade block content h1= title form(method="POST", action="/users") p label(for="username") 사용자명<br/> input#username(name="username") p label(for="name") 이름<br/> input#name(name="name") p label(for="bio") 경력<br/> textarea#bio(name="bio") p input(type="submit", value="사용자 생성") |
[profile.jade]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | // Created by AvILoS on 6/17/15. extends ../layout.jade block content h1= title h2= user.name h3 경력사항 p= user.bio // users.js에 "router.delete('/:username', function(req,res)" 부분과 같이 method를 delete // 를 전송하며 매개변수로 사용자 정보를 전송하여 삭제처리 // 사용자 삭제 // users.js에서 "var methodOverride = require('method-override');" // 와 같이 Method를 오버라이드 하여 사용할 수 있게 했으므로 아래와 같이 POST로 최초에 전송을 하지만 받는쪽에서는 // 실제 처리되는 method는 DELETE로 처리할 수 있도록 한다. form(action="/users/"+index+"?_method=DELETE",method="POST") input(type="submit", value="사용자 삭제") <br/> // 사용자 수정 form(action="/users/"+index+"/edit",method="POST") p label(for="username") 사용자명<br/> input#username(name="username",value=user.username) p label(for="name") 이름<br/> input#name(name="name",value=user.name) p label(for="bio") 경력<br/> input#bio(name="bio",value=user.bio) p input(type="submit", value="사용자 수정") |
'Programming > Node.js' 카테고리의 다른 글
Node.js 공부 자료 (0) | 2016.03.06 |
---|