diff --git a/README.md b/README.md index 35e7217..13695a6 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,22 @@ Node.js 프로그래밍 : 클라우드 컴퓨팅 시대의 고성능 자바스 - [강컴](http://kangcom.com/sub/view.asp?topid=5&sku=201202070001) - [인터파크](http://book.interpark.com/product/BookDisplay.do?_method=detail&sc.shopNo=0000400000&sc.prdNo=209853133&bookblockname=b_sch&booklinkname=bprd_title) - [교보문고](http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9788960772762) -* 이 예제는 Node.js v0.6.6 기반으로 작성되었습니다. +* 이 예제는 Node.js v0.8.14 기반으로 작성되었습니다. * 잘못된 부분을 발견하시면 이슈에 등록해 주세요. +## 기존 소스에 비해서 주요 변경사항 + +* node 0.8.x 호환성 맞춤 + * `path.exist` -> `fs.exist` +* npm 모듈 최신버전으로 갱신 + * restler 2.0.1로 업그래이드 + * express 3.1.x로 업그래이드 + * express 실행코드 변경 + * jade 템플릿을 레이아웃 방식에서 상속방식으로 변경 + * socket.io 연동객체 변경 + * socket.io 0.9.x으로 업그래이드 + * clog 0.1.x로 업그래이드 + +* 주요 변경사항은 [커밋로그](https://github.com/outsideris/node.js-programming/commit/c0b42b349135b2ad5c85f8f3165bbeec99f6ffb1)에서 확인할 수 있습니다. + diff --git a/chapter-05/app1.js b/chapter-05/app1.js index 9b0e3f4..d005491 100644 --- a/chapter-05/app1.js +++ b/chapter-05/app1.js @@ -1,17 +1,26 @@ -var rest = require('restler'); +var rest = require('restler') + , auth = require('./auth'); var Tweet = { sinceId: '1' , getTweets: function(search, callback) { search = encodeURIComponent(search); - - rest.get( - 'http://search.twitter.com/search.json?q=' + search + - '&result_type=recent' + - '&rpp=100' + - '&since_id=' + Tweet.sinceId - ).on('complete', function(data) { - console.log(data); + + // auth()에서 엑세스토큰을 얻어오고 API 요청을 할 때 헤더로 전달한다 + auth(function(err, accessToken) { + rest.get( + 'https://api.twitter.com/1.1/search/tweets.json?q=' + search + + '&result_type=recent' + + '&count=100' + + '&since_id=' + Tweet.sinceId + , { + 'headers': { + 'Authorization': accessToken + } + } + ).on('complete', function(data) { + console.log(data); + }); }); } } diff --git a/chapter-05/app2.js b/chapter-05/app2.js index be29a11..4b34979 100644 --- a/chapter-05/app2.js +++ b/chapter-05/app2.js @@ -1,30 +1,39 @@ var rest = require('restler') - , fs = require('fs'); + , fs = require('fs') + , auth = require('./auth'); var Tweet = { sinceId: '1' , getTweets: function(search, callback) { search = encodeURIComponent(search); - rest.get( - 'http://search.twitter.com/search.json?q=' + search + - '&result_type=recent' + - '&rpp=100' + - '&since_id=' + Tweet.sinceId - ).on('complete', function(data) { - var text = ""; - data.results.forEach(function(elem, index, array) { - text += elem.from_user + ': ' + - elem.text + ' at' + elem.created_at + '\n'; - }); + // auth()에서 엑세스토큰을 얻어오고 API 요청을 할 때 헤더로 전달한다 + auth(function(err, accessToken) { + rest.get( + 'https://api.twitter.com/1.1/search/tweets.json?q=' + search + + '&result_type=recent' + + '&count=100' + + '&since_id=' + Tweet.sinceId + , { + 'headers': { + 'Authorization': accessToken + } + } + ).on('complete', function(data) { + var text = ""; + data.statuses.forEach(function(elem, index, array) { + text += elem.user.screen_name + ': ' + + elem.text + ' at' + elem.created_at + '\n'; + }); - fs.open('./tweets.txt', 'a', 0666, function(err, fd) { - if(err) { throw err; } - var buffer = new Buffer(text); - fs.write(fd, buffer, 0, buffer.length, null - , function(err) { - fs.close(fd, function() { - }); + fs.open('./tweets.txt', 'a', 0666, function(err, fd) { + if(err) { throw err; } + var buffer = new Buffer(text); + fs.write(fd, buffer, 0, buffer.length, null + , function(err) { + fs.close(fd, function() { + }); + }); }); }); }); diff --git a/chapter-05/app3.js b/chapter-05/app3.js index 5b2a415..6129ecd 100644 --- a/chapter-05/app3.js +++ b/chapter-05/app3.js @@ -1,5 +1,6 @@ var rest = require('restler') - , fs = require('fs'); + , fs = require('fs') + , auth = require('./auth'); var Tweet = { sinceId: '1' @@ -11,36 +12,44 @@ var Tweet = { if (err) { Tweet.sinceId = 1; } else { Tweet.sinceId = maxId; } - rest.get( - 'http://search.twitter.com/search.json?q=' + search + - '&result_type=recent' + - '&rpp=100' + - '&since_id=' + Tweet.sinceId - ).on('complete', function(data) { - var text = ""; - data.results.forEach(function(elem, index, array) { - text += elem.from_user + ': ' + - elem.text + ' at' + elem.created_at + '\n'; - }); + // auth()에서 엑세스토큰을 얻어오고 API 요청을 할 때 헤더로 전달한다 + auth(function(err, accessToken) { + rest.get( + 'https://api.twitter.com/1.1/search/tweets.json?q=' + search + + '&result_type=recent' + + '&count=100' + + '&since_id=' + Tweet.sinceId + , { + 'headers': { + 'Authorization': accessToken + } + } + ).on('complete', function(data) { + var text = ""; + data.statuses.forEach(function(elem, index, array) { + text += elem.user.screen_name + ': ' + + elem.text + ' at' + elem.created_at + '\n'; + }); - if (!Tweet.isOpened) { - fs.open('./tweets.txt', 'a', 0666, function(err, fd) { - if(err) { throw err; } + if (!Tweet.isOpened) { + fs.open('./tweets.txt', 'a', 0666, function(err, fd) { + if(err) { throw err; } - Tweet.isOpened = true; - var buffer = new Buffer(text); - fs.write(fd, buffer, 0, buffer.length, null - , function(err) { - fs.close(fd, function() { - Tweet.isOpened = false; - fs.writeFile('./maxid.txt' - , data.max_id.toString() - , function(err) {} - ); - }); + Tweet.isOpened = true; + var buffer = new Buffer(text); + fs.write(fd, buffer, 0, buffer.length, null + , function(err) { + fs.close(fd, function() { + Tweet.isOpened = false; + fs.writeFile('./maxid.txt' + , data.search_metadata.max_id.toString() + , function(err) {} + ); + }); + }); }); - }); - } + } + }); }); }); } diff --git a/chapter-05/app4.js b/chapter-05/app4.js index e0a31b7..93551f6 100644 --- a/chapter-05/app4.js +++ b/chapter-05/app4.js @@ -1,6 +1,7 @@ var rest = require('restler') , fs = require('fs') - , schedule = require('node-schedule'); + , schedule = require('node-schedule') + , auth = require('./auth'); var Tweet = { sinceId: '1' @@ -12,36 +13,44 @@ var Tweet = { if (err) { Tweet.sinceId = 1; } else { Tweet.sinceId = maxId; } - rest.get( - 'http://search.twitter.com/search.json?q=' + search + - '&result_type=recent' + - '&rpp=100' + - '&since_id=' + Tweet.sinceId - ).on('complete', function(data) { - var text = ""; - data.results.forEach(function(elem, index, array) { - text += elem.from_user + ': ' + - elem.text + ' at' + elem.created_at + '\n'; - }); + // auth()에서 엑세스토큰을 얻어오고 API 요청을 할 때 헤더로 전달한다 + auth(function(err, accessToken) { + rest.get( + 'https://api.twitter.com/1.1/search/tweets.json?q=' + search + + '&result_type=recent' + + '&count=100' + + '&since_id=' + Tweet.sinceId + , { + 'headers': { + 'Authorization': accessToken + } + } + ).on('complete', function(data) { + var text = ""; + data.statuses.forEach(function(elem, index, array) { + text += elem.user.screen_name + ': ' + + elem.text + ' at' + elem.created_at + '\n'; + }); - if (!Tweet.isOpened) { - fs.open('./tweets.txt', 'a', 0666, function(err, fd) { - if(err) { throw err; } + if (!Tweet.isOpened) { + fs.open('./tweets.txt', 'a', 0666, function(err, fd) { + if(err) { throw err; } - Tweet.isOpened = true; - var buffer = new Buffer(text); - fs.write(fd, buffer, 0, buffer.length, null - , function(err) { - fs.close(fd, function() { - Tweet.isOpened = false; - fs.writeFile('./maxid.txt' - , data.max_id.toString() - , function(err) {} - ); - }); + Tweet.isOpened = true; + var buffer = new Buffer(text); + fs.write(fd, buffer, 0, buffer.length, null + , function(err) { + fs.close(fd, function() { + Tweet.isOpened = false; + fs.writeFile('./maxid.txt' + , data.search_metadata.max_id.toString() + , function(err) {} + ); + }); + }); }); - }); - } + } + }); }); }); } diff --git a/chapter-05/auth.js b/chapter-05/auth.js new file mode 100644 index 0000000..c2f49ef --- /dev/null +++ b/chapter-05/auth.js @@ -0,0 +1,26 @@ +// https://dev.twitter.com/apps 에서 새로운 어플리케이션을 만든 후 +// 생성된 Consumer key와 Consumer secret 키를 아래 변수에 +// 입력해야 함. +var rest = require('restler'); + +module.exports = function(callback) { + var consumerKey = '생성한 Consumer Key', + consumerSecret = '생성한 Consumer Secret'; + + rest.post('https://api.twitter.com/oauth2/token', { + 'Content-Type': 'application/x-www-form-urlencoded' + , 'User-Agent': 'Nodejs-programming' + , 'data': { + 'grant_type': 'client_credentials' + , 'client_id': consumerKey + , 'client_secret': consumerSecret + , 'code': '' + } + }).on('success', function(data) { + var accessToken = 'Bearer ' + data.access_token; + callback(null, accessToken); + }).on('fail', function(data, res) { + console.log('엑세스토큰을 얻는데 실패했습니다'); + console.log(data); + }); +}; diff --git a/chapter-05/package.json b/chapter-05/package.json index 682de08..49faf21 100644 --- a/chapter-05/package.json +++ b/chapter-05/package.json @@ -9,8 +9,8 @@ "node": "~v0.4.10" }, "dependencies": { - "node-schedule": "~0.1.4" - , "restler": "~0.2.3" + "node-schedule": "~0.1.5" + , "restler": "~3.1.0" }, "devDependencies": {} } diff --git a/chapter-06/joinin-mongodb/app.js b/chapter-06/joinin-mongodb/app.js index 8dc1e76..b5ce54a 100644 --- a/chapter-06/joinin-mongodb/app.js +++ b/chapter-06/joinin-mongodb/app.js @@ -4,9 +4,10 @@ */ var express = require('express') + , http = require('http') , routes = require('./routes') -var app = module.exports = express.createServer(); +var app = module.exports = express(); // Configuration @@ -33,5 +34,6 @@ app.get('/', routes.index); app.get('/join', routes.form); app.post('/join', routes.join); -app.listen(3000); -console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); +var server = http.createServer(app); +server.listen(3000); +console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env); diff --git a/chapter-06/joinin-mongodb/package.json b/chapter-06/joinin-mongodb/package.json index ed8eb27..82ad8f9 100644 --- a/chapter-06/joinin-mongodb/package.json +++ b/chapter-06/joinin-mongodb/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "express": "~2.5.0", + "express": "~3.4.8", "jade": ">= 0.0.1", "mongolian": "~0.1.14" } diff --git a/chapter-06/joinin-mongodb/views/index.jade b/chapter-06/joinin-mongodb/views/index.jade index c9c35fa..dcf18da 100644 --- a/chapter-06/joinin-mongodb/views/index.jade +++ b/chapter-06/joinin-mongodb/views/index.jade @@ -1,2 +1,5 @@ -h1= title -p Welcome to #{title} \ No newline at end of file +extends layout + +block contents + h1= title + p Welcome to #{title} diff --git a/chapter-06/joinin-mongodb/views/join-fail.jade b/chapter-06/joinin-mongodb/views/join-fail.jade index 0064a29..dc62bcb 100644 --- a/chapter-06/joinin-mongodb/views/join-fail.jade +++ b/chapter-06/joinin-mongodb/views/join-fail.jade @@ -1,3 +1,6 @@ -h3 회원가입 오류 -p 이미 가입된 이름 또는 이메일입니다. -a(href='/join') 회원 가입페이지로 돌아가기 +extends layout + +block contents + h3 회원가입 오류 + p 이미 가입된 이름 또는 이메일입니다. + a(href='/join') 회원 가입페이지로 돌아가기 diff --git a/chapter-06/joinin-mongodb/views/join-form.jade b/chapter-06/joinin-mongodb/views/join-form.jade index 5aab3da..ac9c3d9 100644 --- a/chapter-06/joinin-mongodb/views/join-form.jade +++ b/chapter-06/joinin-mongodb/views/join-form.jade @@ -1,19 +1,22 @@ -h3 회원가입 -p 회원에 가입해 주세요. -form(id='joinForm', method='POST', action='/join') - label(for='name') 이름 : - input(type='text', name='name', id='name') - label(for='email') 이메일 : - input(type='text', name='email', id='email') - input(type='submit', value='전송') +extends layout -script(type='text/javascript') - $(document).ready(function() { - $('#joinForm').submit(function(e) { - if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { - alert('이름과 이메일을 입력해 주세요.'); - return false; - } - }); - }); - +block contents + h3 회원가입 + p 회원에 가입해 주세요. + form(id='joinForm', method='POST', action='/join') + label(for='name') 이름 : + input(type='text', name='name', id='name') + label(for='email') 이메일 : + input(type='text', name='email', id='email') + input(type='submit', value='전송') + + script(type='text/javascript'). + $(document).ready(function() { + $('#joinForm').submit(function(e) { + if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { + alert('이름과 이메일을 입력해 주세요.'); + return false; + } + }); + }); + diff --git a/chapter-06/joinin-mongodb/views/join-result.jade b/chapter-06/joinin-mongodb/views/join-result.jade index f1a825d..fea1b68 100644 --- a/chapter-06/joinin-mongodb/views/join-result.jade +++ b/chapter-06/joinin-mongodb/views/join-result.jade @@ -1,6 +1,9 @@ -h3 회원가입완료 -p 가입한 회원 정보는 아래와 같습니다. -div - ul - li 이름 : #{username} - li 이메일 : #{useremail} +extends layout + +block contents + h3 회원가입완료 + p 가입한 회원 정보는 아래와 같습니다. + div + ul + li 이름 : #{username} + li 이메일 : #{useremail} diff --git a/chapter-06/joinin-mongodb/views/layout.jade b/chapter-06/joinin-mongodb/views/layout.jade index f2051cc..c89f4e8 100644 --- a/chapter-06/joinin-mongodb/views/layout.jade +++ b/chapter-06/joinin-mongodb/views/layout.jade @@ -1,7 +1,8 @@ -!!! +doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') script(type='text/javascript', src='http://code.jquery.com/jquery-1.7.0.min.js') - body!= body + body + block contents diff --git a/chapter-06/joinin-mysql/app.js b/chapter-06/joinin-mysql/app.js index 8dc1e76..b5ce54a 100644 --- a/chapter-06/joinin-mysql/app.js +++ b/chapter-06/joinin-mysql/app.js @@ -4,9 +4,10 @@ */ var express = require('express') + , http = require('http') , routes = require('./routes') -var app = module.exports = express.createServer(); +var app = module.exports = express(); // Configuration @@ -33,5 +34,6 @@ app.get('/', routes.index); app.get('/join', routes.form); app.post('/join', routes.join); -app.listen(3000); -console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); +var server = http.createServer(app); +server.listen(3000); +console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env); diff --git a/chapter-06/joinin-mysql/package.json b/chapter-06/joinin-mysql/package.json index efc9c2c..d1494c5 100644 --- a/chapter-06/joinin-mysql/package.json +++ b/chapter-06/joinin-mysql/package.json @@ -3,8 +3,8 @@ "version": "0.0.1", "private": true, "dependencies": { - "express": "~2.5.0", + "express": "~3.4.8", "jade": ">= 0.0.1", - "mysql": "~0.9.5" + "mysql": "~2.0.1" } } diff --git a/chapter-06/joinin-mysql/repository.js b/chapter-06/joinin-mysql/repository.js index f9b41fb..98aa169 100644 --- a/chapter-06/joinin-mysql/repository.js +++ b/chapter-06/joinin-mysql/repository.js @@ -1,7 +1,7 @@ var mysql = require('mysql') , DATABASE = 'node_test' , TABLE = 'members' - , client = mysql.createClient({ + , client = mysql.createConnection({ user: 'node' , password: 'pass' }); diff --git a/chapter-06/joinin-mysql/views/index.jade b/chapter-06/joinin-mysql/views/index.jade index c9c35fa..dcf18da 100644 --- a/chapter-06/joinin-mysql/views/index.jade +++ b/chapter-06/joinin-mysql/views/index.jade @@ -1,2 +1,5 @@ -h1= title -p Welcome to #{title} \ No newline at end of file +extends layout + +block contents + h1= title + p Welcome to #{title} diff --git a/chapter-06/joinin-mysql/views/join-fail.jade b/chapter-06/joinin-mysql/views/join-fail.jade index 0064a29..dc62bcb 100644 --- a/chapter-06/joinin-mysql/views/join-fail.jade +++ b/chapter-06/joinin-mysql/views/join-fail.jade @@ -1,3 +1,6 @@ -h3 회원가입 오류 -p 이미 가입된 이름 또는 이메일입니다. -a(href='/join') 회원 가입페이지로 돌아가기 +extends layout + +block contents + h3 회원가입 오류 + p 이미 가입된 이름 또는 이메일입니다. + a(href='/join') 회원 가입페이지로 돌아가기 diff --git a/chapter-06/joinin-mysql/views/join-form.jade b/chapter-06/joinin-mysql/views/join-form.jade index 5aab3da..ac9c3d9 100644 --- a/chapter-06/joinin-mysql/views/join-form.jade +++ b/chapter-06/joinin-mysql/views/join-form.jade @@ -1,19 +1,22 @@ -h3 회원가입 -p 회원에 가입해 주세요. -form(id='joinForm', method='POST', action='/join') - label(for='name') 이름 : - input(type='text', name='name', id='name') - label(for='email') 이메일 : - input(type='text', name='email', id='email') - input(type='submit', value='전송') +extends layout -script(type='text/javascript') - $(document).ready(function() { - $('#joinForm').submit(function(e) { - if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { - alert('이름과 이메일을 입력해 주세요.'); - return false; - } - }); - }); - +block contents + h3 회원가입 + p 회원에 가입해 주세요. + form(id='joinForm', method='POST', action='/join') + label(for='name') 이름 : + input(type='text', name='name', id='name') + label(for='email') 이메일 : + input(type='text', name='email', id='email') + input(type='submit', value='전송') + + script(type='text/javascript'). + $(document).ready(function() { + $('#joinForm').submit(function(e) { + if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { + alert('이름과 이메일을 입력해 주세요.'); + return false; + } + }); + }); + diff --git a/chapter-06/joinin-mysql/views/join-result.jade b/chapter-06/joinin-mysql/views/join-result.jade index f1a825d..fea1b68 100644 --- a/chapter-06/joinin-mysql/views/join-result.jade +++ b/chapter-06/joinin-mysql/views/join-result.jade @@ -1,6 +1,9 @@ -h3 회원가입완료 -p 가입한 회원 정보는 아래와 같습니다. -div - ul - li 이름 : #{username} - li 이메일 : #{useremail} +extends layout + +block contents + h3 회원가입완료 + p 가입한 회원 정보는 아래와 같습니다. + div + ul + li 이름 : #{username} + li 이메일 : #{useremail} diff --git a/chapter-06/joinin-mysql/views/layout.jade b/chapter-06/joinin-mysql/views/layout.jade index f2051cc..c89f4e8 100644 --- a/chapter-06/joinin-mysql/views/layout.jade +++ b/chapter-06/joinin-mysql/views/layout.jade @@ -1,7 +1,8 @@ -!!! +doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') script(type='text/javascript', src='http://code.jquery.com/jquery-1.7.0.min.js') - body!= body + body + block contents diff --git a/chapter-06/joinin/app.js b/chapter-06/joinin/app.js index 8dc1e76..b5ce54a 100644 --- a/chapter-06/joinin/app.js +++ b/chapter-06/joinin/app.js @@ -4,9 +4,10 @@ */ var express = require('express') + , http = require('http') , routes = require('./routes') -var app = module.exports = express.createServer(); +var app = module.exports = express(); // Configuration @@ -33,5 +34,6 @@ app.get('/', routes.index); app.get('/join', routes.form); app.post('/join', routes.join); -app.listen(3000); -console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); +var server = http.createServer(app); +server.listen(3000); +console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env); diff --git a/chapter-06/joinin/package.json b/chapter-06/joinin/package.json index b2ea708..18ec444 100644 --- a/chapter-06/joinin/package.json +++ b/chapter-06/joinin/package.json @@ -3,7 +3,7 @@ , "version": "0.0.1" , "private": true , "dependencies": { - "express": "~2.5.0" + "express": "~3.4.8" , "jade": ">= 0.0.1" } } diff --git a/chapter-06/joinin/views/index.jade b/chapter-06/joinin/views/index.jade index c9c35fa..dcf18da 100644 --- a/chapter-06/joinin/views/index.jade +++ b/chapter-06/joinin/views/index.jade @@ -1,2 +1,5 @@ -h1= title -p Welcome to #{title} \ No newline at end of file +extends layout + +block contents + h1= title + p Welcome to #{title} diff --git a/chapter-06/joinin/views/join-form.jade b/chapter-06/joinin/views/join-form.jade index 5aab3da..ac9c3d9 100644 --- a/chapter-06/joinin/views/join-form.jade +++ b/chapter-06/joinin/views/join-form.jade @@ -1,19 +1,22 @@ -h3 회원가입 -p 회원에 가입해 주세요. -form(id='joinForm', method='POST', action='/join') - label(for='name') 이름 : - input(type='text', name='name', id='name') - label(for='email') 이메일 : - input(type='text', name='email', id='email') - input(type='submit', value='전송') +extends layout -script(type='text/javascript') - $(document).ready(function() { - $('#joinForm').submit(function(e) { - if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { - alert('이름과 이메일을 입력해 주세요.'); - return false; - } - }); - }); - +block contents + h3 회원가입 + p 회원에 가입해 주세요. + form(id='joinForm', method='POST', action='/join') + label(for='name') 이름 : + input(type='text', name='name', id='name') + label(for='email') 이메일 : + input(type='text', name='email', id='email') + input(type='submit', value='전송') + + script(type='text/javascript'). + $(document).ready(function() { + $('#joinForm').submit(function(e) { + if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { + alert('이름과 이메일을 입력해 주세요.'); + return false; + } + }); + }); + diff --git a/chapter-06/joinin/views/join-result.jade b/chapter-06/joinin/views/join-result.jade index f1a825d..fea1b68 100644 --- a/chapter-06/joinin/views/join-result.jade +++ b/chapter-06/joinin/views/join-result.jade @@ -1,6 +1,9 @@ -h3 회원가입완료 -p 가입한 회원 정보는 아래와 같습니다. -div - ul - li 이름 : #{username} - li 이메일 : #{useremail} +extends layout + +block contents + h3 회원가입완료 + p 가입한 회원 정보는 아래와 같습니다. + div + ul + li 이름 : #{username} + li 이메일 : #{useremail} diff --git a/chapter-06/joinin/views/layout.jade b/chapter-06/joinin/views/layout.jade index f2051cc..c89f4e8 100644 --- a/chapter-06/joinin/views/layout.jade +++ b/chapter-06/joinin/views/layout.jade @@ -1,7 +1,8 @@ -!!! +doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') script(type='text/javascript', src='http://code.jquery.com/jquery-1.7.0.min.js') - body!= body + body + block contents diff --git a/chapter-06/simpleweb/app.js b/chapter-06/simpleweb/app.js index 7574676..4870393 100644 --- a/chapter-06/simpleweb/app.js +++ b/chapter-06/simpleweb/app.js @@ -4,9 +4,10 @@ */ var express = require('express') + , http = require('http') , routes = require('./routes') -var app = module.exports = express.createServer(); +var app = module.exports = express(); // Configuration @@ -31,5 +32,7 @@ app.configure('production', function(){ app.get('/', routes.index); -app.listen(3000); -console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); + +var server = http.createServer(app); +server.listen(3000); +console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env); diff --git a/chapter-06/simpleweb/package.json b/chapter-06/simpleweb/package.json index b2ea708..18ec444 100644 --- a/chapter-06/simpleweb/package.json +++ b/chapter-06/simpleweb/package.json @@ -3,7 +3,7 @@ , "version": "0.0.1" , "private": true , "dependencies": { - "express": "~2.5.0" + "express": "~3.4.8" , "jade": ">= 0.0.1" } } diff --git a/chapter-06/simpleweb/views/index.jade b/chapter-06/simpleweb/views/index.jade index c9c35fa..dcf18da 100644 --- a/chapter-06/simpleweb/views/index.jade +++ b/chapter-06/simpleweb/views/index.jade @@ -1,2 +1,5 @@ -h1= title -p Welcome to #{title} \ No newline at end of file +extends layout + +block contents + h1= title + p Welcome to #{title} diff --git a/chapter-06/simpleweb/views/layout.jade b/chapter-06/simpleweb/views/layout.jade index 1a36941..f63f45a 100644 --- a/chapter-06/simpleweb/views/layout.jade +++ b/chapter-06/simpleweb/views/layout.jade @@ -1,6 +1,7 @@ -!!! +doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') - body!= body \ No newline at end of file + body + block contents diff --git a/chapter-07/connect/package.json b/chapter-07/connect/package.json index e7b5138..c3d6952 100644 --- a/chapter-07/connect/package.json +++ b/chapter-07/connect/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "socket.io": "0.8.7" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/connect/server.js b/chapter-07/connect/server.js index 3abed2c..4f45f8c 100644 --- a/chapter-07/connect/server.js +++ b/chapter-07/connect/server.js @@ -6,7 +6,7 @@ var http = require('http') var server = http.createServer(function(req, res) { var filename = path.join(process.cwd(), req.url); - path.exists(filename, function(exists) { + fs.exists(filename, function(exists) { if(!exists) { res.writeHead(404, {"Content-Type": "text/plain"}); res.write("404 Not Found\n"); diff --git a/chapter-07/custom-event/package.json b/chapter-07/custom-event/package.json index e7b5138..c3d6952 100644 --- a/chapter-07/custom-event/package.json +++ b/chapter-07/custom-event/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "socket.io": "0.8.7" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/custom-event/server.js b/chapter-07/custom-event/server.js index 48d5b1b..9fbc38f 100644 --- a/chapter-07/custom-event/server.js +++ b/chapter-07/custom-event/server.js @@ -6,7 +6,7 @@ var http = require('http') var server = http.createServer(function(req, res) { var filename = path.join(process.cwd(), req.url); - path.exists(filename, function(exists) { + fs.exists(filename, function(exists) { if(!exists) { res.writeHead(404, {"Content-Type": "text/plain"}); res.write("404 Not Found\n"); diff --git a/chapter-07/message/package.json b/chapter-07/message/package.json index e7b5138..c3d6952 100644 --- a/chapter-07/message/package.json +++ b/chapter-07/message/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "socket.io": "0.8.7" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/message/server.js b/chapter-07/message/server.js index a78ed51..6fdbcf8 100644 --- a/chapter-07/message/server.js +++ b/chapter-07/message/server.js @@ -6,7 +6,7 @@ var http = require('http') var server = http.createServer(function(req, res) { var filename = path.join(process.cwd(), req.url); - path.exists(filename, function(exists) { + fs.exists(filename, function(exists) { if(!exists) { res.writeHead(404, {"Content-Type": "text/plain"}); res.write("404 Not Found\n"); diff --git a/chapter-07/namespace/package.json b/chapter-07/namespace/package.json index e7b5138..c3d6952 100644 --- a/chapter-07/namespace/package.json +++ b/chapter-07/namespace/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "socket.io": "0.8.7" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/namespace/server.js b/chapter-07/namespace/server.js index 1b03341..f66d13a 100644 --- a/chapter-07/namespace/server.js +++ b/chapter-07/namespace/server.js @@ -6,7 +6,7 @@ var http = require('http') var server = http.createServer(function(req, res) { var filename = path.join(process.cwd(), req.url); - path.exists(filename, function(exists) { + fs.exists(filename, function(exists) { if(!exists) { res.writeHead(404, {"Content-Type": "text/plain"}); res.write("404 Not Found\n"); diff --git a/chapter-07/room/package.json b/chapter-07/room/package.json index e7b5138..c3d6952 100644 --- a/chapter-07/room/package.json +++ b/chapter-07/room/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "socket.io": "0.8.7" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/room/server.js b/chapter-07/room/server.js index ad57dfa..715596a 100644 --- a/chapter-07/room/server.js +++ b/chapter-07/room/server.js @@ -6,7 +6,7 @@ var http = require('http') var server = http.createServer(function(req, res) { var filename = path.join(process.cwd(), req.url); - path.exists(filename, function(exists) { + fs.exists(filename, function(exists) { if(!exists) { res.writeHead(404, {"Content-Type": "text/plain"}); res.write("404 Not Found\n"); diff --git a/chapter-07/volatile/package.json b/chapter-07/volatile/package.json index e7b5138..c3d6952 100644 --- a/chapter-07/volatile/package.json +++ b/chapter-07/volatile/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "socket.io": "0.8.7" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/volatile/server.js b/chapter-07/volatile/server.js index 9e54010..beb044c 100644 --- a/chapter-07/volatile/server.js +++ b/chapter-07/volatile/server.js @@ -6,7 +6,7 @@ var http = require('http') var server = http.createServer(function(req, res) { var filename = path.join(process.cwd(), req.url); - path.exists(filename, function(exists) { + fs.exists(filename, function(exists) { if(!exists) { res.writeHead(404, {"Content-Type": "text/plain"}); res.write("404 Not Found\n"); diff --git a/chapter-08/simple-chat/app.js b/chapter-08/simple-chat/app.js index fd9bb1d..dcd004e 100644 --- a/chapter-08/simple-chat/app.js +++ b/chapter-08/simple-chat/app.js @@ -4,9 +4,10 @@ */ var express = require('express') + , http = require('http') , Chat = require('./chat'); -var app = module.exports = express.createServer(); +var app = module.exports = express(); // Configuration @@ -102,9 +103,10 @@ app.get('/join/:id', function(req, res) { }); }); -app.listen(3000); +var server = http.createServer(app); +server.listen(3000); // Socket.io -require('./rooms')(app); +require('./rooms')(server); -console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); +console.log("Express server listening on port %d in %s mode", server.address().port, app.settings.env); diff --git a/chapter-08/simple-chat/package.json b/chapter-08/simple-chat/package.json index 46bdae1..9961bfd 100644 --- a/chapter-08/simple-chat/package.json +++ b/chapter-08/simple-chat/package.json @@ -3,8 +3,8 @@ "version": "0.0.1", "private": true, "dependencies": { - "express": "~2.5.0", + "express": "~3.4.8", "jade": ">= 0.0.1", - "socket.io": "~0.8.7" + "socket.io": "~0.9.16" } } diff --git a/chapter-08/simple-chat/views/enter.jade b/chapter-08/simple-chat/views/enter.jade index 339a5d9..5216419 100644 --- a/chapter-08/simple-chat/views/enter.jade +++ b/chapter-08/simple-chat/views/enter.jade @@ -1,22 +1,25 @@ -- if (isSuccess) - h2 채팅방 목록 - p #{nickname}님 환영합니다. - p 원하는 채팅방이 없으면 채팅방을 만드세요. - form(action='/makeRoom', method='POST') - label(for='roomname') 방제 - input(type='text', id='roomname', name='roomname') - input(type='submit', value='방 만들기') - ul - each room in roomList - li= room - input(type='button', value='입장', - onclick='location.href=\'/join/' + room + '\''); -- else - - if (nickname === '') - script(type='text/javascript') - alert('잘못된 닉네임입니다.'); - history.go(-1); +extends layout + +block contents + - if (isSuccess) + h2 채팅방 목록 + p #{nickname}님 환영합니다. + p 원하는 채팅방이 없으면 채팅방을 만드세요. + form(action='/makeRoom', method='POST') + label(for='roomname') 방제 + input(type='text', id='roomname', name='roomname') + input(type='submit', value='방 만들기') + ul + each room in roomList + li= room + input(type='button', value='입장', + onclick='location.href=\'/join/' + room + '\'') - else - script(type='text/javascript') - alert('사용중인 닉네임입니다.'); - history.go(-1); + - if (nickname === '') + script(type='text/javascript'). + alert('잘못된 닉네임입니다.'); + history.go(-1); + - else + script(type='text/javascript'). + alert('사용중인 닉네임입니다.'); + history.go(-1); diff --git a/chapter-08/simple-chat/views/index.jade b/chapter-08/simple-chat/views/index.jade index 0c9f851..6afd757 100644 --- a/chapter-08/simple-chat/views/index.jade +++ b/chapter-08/simple-chat/views/index.jade @@ -1,15 +1,18 @@ -h2 채팅방 -form(action='/enter', method='POST') - label(for='nickname') 닉네임을 입력해 주세요. - input(type='text', id='nickname', name='nickname') - input(type='submit', value='입장') +extends layout -script(type='text/javascript') - $(document).ready(function() { - $('form').submit(function(e) { - if ($.trim($('#nickname').val()) === '') { - alert('닉네임을 입력해 주세요.'); - return false; - } +block contents + h2 채팅방 + form(action='/enter', method='POST') + label(for='nickname') 닉네임을 입력해 주세요. + input(type='text', id='nickname', name='nickname') + input(type='submit', value='입장') + + script(type='text/javascript'). + $(document).ready(function() { + $('form').submit(function(e) { + if ($.trim($('#nickname').val()) === '') { + alert('닉네임을 입력해 주세요.'); + return false; + } + }); }); - }); diff --git a/chapter-08/simple-chat/views/layout.jade b/chapter-08/simple-chat/views/layout.jade index a0d407b..d885edf 100644 --- a/chapter-08/simple-chat/views/layout.jade +++ b/chapter-08/simple-chat/views/layout.jade @@ -1,8 +1,9 @@ -!!! +doctype html html head title Simple Chat link(rel='stylesheet', href='/stylesheets/style.css') script(type='text/javascript', src='/javascripts/jquery-1.7.0.min.js') script(type='text/javascript', src='/socket.io/socket.io.js') - body!= body + body + block contents diff --git a/chapter-08/simple-chat/views/makeRoom.jade b/chapter-08/simple-chat/views/makeRoom.jade index ce3fbf8..048217b 100644 --- a/chapter-08/simple-chat/views/makeRoom.jade +++ b/chapter-08/simple-chat/views/makeRoom.jade @@ -1,12 +1,15 @@ -- if (isSuccess) - script - alert('방이 만들어졌습니다.'); - location.href = '/join/#{roomName}'; -- else if (roomName === '') - script - alert('방을 만들지 못했습니다.'); - location.href = '/enter'; -- else - script - alert('이미 존재하는 방입니다.'); - location.href = '/enter'; +extends layout + +block contents + - if (isSuccess) + script. + alert('방이 만들어졌습니다.'); + location.href = '/join/#{roomName}'; + - else if (roomName === '') + script. + alert('방을 만들지 못했습니다.'); + location.href = '/enter'; + - else + script. + alert('이미 존재하는 방입니다.'); + location.href = '/enter'; diff --git a/chapter-08/simple-chat/views/room.jade b/chapter-08/simple-chat/views/room.jade index 0de5592..24e5f23 100644 --- a/chapter-08/simple-chat/views/room.jade +++ b/chapter-08/simple-chat/views/room.jade @@ -1,70 +1,73 @@ -- if (!isSuccess) - script - alert('방에 입장할 수 없습니다.'); - location.href = '/enter'; -- else - h3 방제 : - span#roomName= roomName - input#leave(type='button', value='나가기') - #chatWindow(style='width:400px; height:400px; overflow:auto; border:1px solid #000; float:left; margin-right:10px;') - - div(style='width:100px; height:400px; overflow:auto; border:1px solid #000;') - p 참가자 - ul#attendants - each attendant in attendants - li(id='attendant-'+attendant)= attendant - form - span#myName #{nickName} - input(type='text', style='width:300px;')#message - input(type='submit', value='보내기') +extends layout - script(type='text/javascript') - $(document).ready(function() { - var room = io.connect('/room'); - var chatWindow = $('#chatWindow'); - var messageBox = $('#message'); - var myName = $('#myName').text(); - var attendants = $('#attendants'); - var showMessage = function(msg) { - chatWindow.append($('
').text(msg)); - chatWindow.scrollTop(chatWindow.height()); - }; +block contents + - if (!isSuccess) + script. + alert('방에 입장할 수 없습니다.'); + location.href = '/enter'; + - else + h3 방제 : + span#roomName= roomName + input#leave(type='button', value='나가기') + #chatWindow(style='width:400px; height:400px; overflow:auto; border:1px solid #000; float:left; margin-right:10px;') + + div(style='width:100px; height:400px; overflow:auto; border:1px solid #000;') + p 참가자 + ul#attendants + each attendant in attendants + li(id='attendant-'+attendant)= attendant + form + span#myName #{nickName} + input(type='text', style='width:300px;')#message + input(type='submit', value='보내기') - room.on('connect', function() { - room.emit('join', {roomName:$('#roomName').text(), nickName:myName}); - }); + script(type='text/javascript'). + $(document).ready(function() { + var room = io.connect('/room'); + var chatWindow = $('#chatWindow'); + var messageBox = $('#message'); + var myName = $('#myName').text(); + var attendants = $('#attendants'); + var showMessage = function(msg) { + chatWindow.append($('
').text(msg)); + chatWindow.scrollTop(chatWindow.height()); + }; - room.on('joined', function(data) { - if(data.isSuccess) { - showMessage(data.nickName + '님이 입장하셨습니다.'); - attendants.append($('