From c0b42b349135b2ad5c85f8f3165bbeec99f6ffb1 Mon Sep 17 00:00:00 2001 From: Outsider Date: Sat, 9 Feb 2013 19:45:43 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=EC=B5=9C=EC=8B=A0=20=EB=B2=84=EC=A0=84?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=98=88=EC=A0=9C=20=EC=97=85?= =?UTF-8?q?=EA=B7=B8=EB=9E=98=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * node 0.8.x에 호환성 맞춤 * express 3.1.x * socket.io 0.9.13 --- chapter-05/package.json | 4 +- chapter-06/joinin-mongodb/app.js | 8 +- chapter-06/joinin-mongodb/package.json | 2 +- chapter-06/joinin-mongodb/views/index.jade | 7 +- .../joinin-mongodb/views/join-fail.jade | 9 +- .../joinin-mongodb/views/join-form.jade | 39 +++--- .../joinin-mongodb/views/join-result.jade | 15 ++- chapter-06/joinin-mongodb/views/layout.jade | 3 +- chapter-06/joinin-mysql/app.js | 8 +- chapter-06/joinin-mysql/package.json | 4 +- chapter-06/joinin-mysql/views/index.jade | 7 +- chapter-06/joinin-mysql/views/join-fail.jade | 9 +- chapter-06/joinin-mysql/views/join-form.jade | 39 +++--- .../joinin-mysql/views/join-result.jade | 15 ++- chapter-06/joinin-mysql/views/layout.jade | 3 +- chapter-06/joinin/app.js | 8 +- chapter-06/joinin/package.json | 2 +- chapter-06/joinin/views/index.jade | 7 +- chapter-06/joinin/views/join-form.jade | 39 +++--- chapter-06/joinin/views/join-result.jade | 15 ++- chapter-06/joinin/views/layout.jade | 3 +- chapter-06/simpleweb/app.js | 9 +- chapter-06/simpleweb/package.json | 2 +- chapter-06/simpleweb/views/index.jade | 7 +- chapter-06/simpleweb/views/layout.jade | 3 +- chapter-07/connect/package.json | 2 +- chapter-07/connect/server.js | 2 +- chapter-07/custom-event/package.json | 2 +- chapter-07/custom-event/server.js | 2 +- chapter-07/message/package.json | 2 +- chapter-07/message/server.js | 2 +- chapter-07/namespace/package.json | 2 +- chapter-07/namespace/server.js | 2 +- chapter-07/room/package.json | 2 +- chapter-07/room/server.js | 2 +- chapter-07/volatile/package.json | 2 +- chapter-07/volatile/server.js | 2 +- chapter-08/simple-chat/app.js | 10 +- chapter-08/simple-chat/package.json | 4 +- chapter-08/simple-chat/views/enter.jade | 45 ++++--- chapter-08/simple-chat/views/index.jade | 29 ++-- chapter-08/simple-chat/views/layout.jade | 3 +- chapter-08/simple-chat/views/makeRoom.jade | 27 ++-- chapter-08/simple-chat/views/room.jade | 127 +++++++++--------- chapter-09/package.json | 2 +- chapter-10/simple-vows/package.json | 2 +- chapter-10/webserver-expresso/package.json | 4 +- .../webserver-expresso/views/index.jade | 7 +- .../webserver-expresso/views/layout.jade | 3 +- 49 files changed, 311 insertions(+), 243 deletions(-) diff --git a/chapter-05/package.json b/chapter-05/package.json index 682de08..c7186ff 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": "~2.0.1" }, "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..f6da7ac 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.1.0", "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..8cb229f 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..646abb0 100644 --- a/chapter-06/joinin-mongodb/views/layout.jade +++ b/chapter-06/joinin-mongodb/views/layout.jade @@ -4,4 +4,5 @@ html 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..64073f1 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.1.0", "jade": ">= 0.0.1", - "mysql": "~0.9.5" + "mysql": "~0.9.6" } } 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..8cb229f 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..646abb0 100644 --- a/chapter-06/joinin-mysql/views/layout.jade +++ b/chapter-06/joinin-mysql/views/layout.jade @@ -4,4 +4,5 @@ html 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..7129b3b 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.1.0" , "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..8cb229f 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..646abb0 100644 --- a/chapter-06/joinin/views/layout.jade +++ b/chapter-06/joinin/views/layout.jade @@ -4,4 +4,5 @@ html 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..7129b3b 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.1.0" , "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..c104427 100644 --- a/chapter-06/simpleweb/views/layout.jade +++ b/chapter-06/simpleweb/views/layout.jade @@ -3,4 +3,5 @@ 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..3a18b49 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.13" }, "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..3a18b49 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.13" }, "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..3a18b49 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.13" }, "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..3a18b49 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.13" }, "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..3a18b49 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.13" }, "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..3a18b49 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.13" }, "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..ee8cf30 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.1.0", "jade": ">= 0.0.1", - "socket.io": "~0.8.7" + "socket.io": "~0.9.13" } } diff --git a/chapter-08/simple-chat/views/enter.jade b/chapter-08/simple-chat/views/enter.jade index 339a5d9..f2b7547 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..3893ab0 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..f434f74 100644 --- a/chapter-08/simple-chat/views/layout.jade +++ b/chapter-08/simple-chat/views/layout.jade @@ -5,4 +5,5 @@ html 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..9136f83 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..45d54e3 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($('

  • ') - .attr('id', 'attendant-'+data.nickName) - .text(data.nickName)); - } - }); + room.on('connect', function() { + room.emit('join', {roomName:$('#roomName').text(), nickName:myName}); + }); - room.on('message', function(data) { - showMessage(data.nickName + ' : ' + data.msg); - }); + room.on('joined', function(data) { + if(data.isSuccess) { + showMessage(data.nickName + '님이 입장하셨습니다.'); + attendants.append($('
  • ') + .attr('id', 'attendant-'+data.nickName) + .text(data.nickName)); + } + }); - room.on('leaved', function(data) { - showMessage(data.nickName + '님이 나가셨습니다.'); - $('#attendant-'+data.nickName).remove(); - }); + room.on('message', function(data) { + showMessage(data.nickName + ' : ' + data.msg); + }); - $('form').submit(function(e) { - e.preventDefault(); - var msg = messageBox.val(); - if ($.trim(msg) !== '') { - showMessage(myName + ' : ' + msg); - room.json.send({nickName:myName, msg:msg}); - messageBox.val(''); - } - }); + room.on('leaved', function(data) { + showMessage(data.nickName + '님이 나가셨습니다.'); + $('#attendant-'+data.nickName).remove(); + }); + + $('form').submit(function(e) { + e.preventDefault(); + var msg = messageBox.val(); + if ($.trim(msg) !== '') { + showMessage(myName + ' : ' + msg); + room.json.send({nickName:myName, msg:msg}); + messageBox.val(''); + } + }); - $('#leave').click(function(e) { - room.emit('leave', {nickName:myName}); - location.href='/enter'; + $('#leave').click(function(e) { + room.emit('leave', {nickName:myName}); + location.href='/enter'; + }); }); - }); - + diff --git a/chapter-09/package.json b/chapter-09/package.json index 12da08a..3b65911 100644 --- a/chapter-09/package.json +++ b/chapter-09/package.json @@ -9,7 +9,7 @@ "node": "~0.4.10" }, "dependencies": { - "clog": "0.0.2" + "clog": "0.1.6" }, "devDependencies": {} } diff --git a/chapter-10/simple-vows/package.json b/chapter-10/simple-vows/package.json index af19113..f973488 100644 --- a/chapter-10/simple-vows/package.json +++ b/chapter-10/simple-vows/package.json @@ -9,7 +9,7 @@ "node": "~0.4.12" }, "dependencies": { - "vows": "~0.6.0" + "vows": "~0.7.0" }, "devDependencies": {} } diff --git a/chapter-10/webserver-expresso/package.json b/chapter-10/webserver-expresso/package.json index 24bed78..3bcb354 100644 --- a/chapter-10/webserver-expresso/package.json +++ b/chapter-10/webserver-expresso/package.json @@ -3,7 +3,7 @@ "version": "0.0.1", "private": true, "dependencies": { - "express": "~2.4.7", - "jade": "~0.16.2" + "express": "~2.5.0", + "jade": ">= 0.0.1" } } diff --git a/chapter-10/webserver-expresso/views/index.jade b/chapter-10/webserver-expresso/views/index.jade index c9c35fa..dcf18da 100644 --- a/chapter-10/webserver-expresso/views/index.jade +++ b/chapter-10/webserver-expresso/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-10/webserver-expresso/views/layout.jade b/chapter-10/webserver-expresso/views/layout.jade index 1a36941..c104427 100644 --- a/chapter-10/webserver-expresso/views/layout.jade +++ b/chapter-10/webserver-expresso/views/layout.jade @@ -3,4 +3,5 @@ html head title= title link(rel='stylesheet', href='/stylesheets/style.css') - body!= body \ No newline at end of file + body + block contents From f2c28397ea13936cdbb432faed7530e585bada3b Mon Sep 17 00:00:00 2001 From: Outsider Date: Sat, 9 Feb 2013 21:41:52 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EB=B8=8C=EB=9E=9C=EC=B9=98=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=82=AC=ED=95=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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)에서 확인할 수 있습니다. + From 522b894abba1dabfe667bfe0df0deb42fe7d3a80 Mon Sep 17 00:00:00 2001 From: Outsider Date: Mon, 27 Jan 2014 13:38:35 +0900 Subject: [PATCH 3/6] =?UTF-8?q?node.js=200.10.x=20=EB=B2=84=EC=A0=84?= =?UTF-8?q?=EA=B3=BC=20=EB=AA=A8=EB=93=88=EC=9D=98=20=EC=B5=9C=EC=8B=A0?= =?UTF-8?q?=EB=B2=84=EC=A0=84=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=98=88?= =?UTF-8?q?=EC=A0=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 주요 변경사항 * 트위터 API 변경(5장) * 트위터 API 1.1로 바뀌고 더이상 기존 1.0 API를 받지 않음. 그래서 API URL이 변경되고 모두 HTTPS를 사용해야 하며 검색 API를 사용할 때도 인증이 필요하게 됨. * 인증관련 로직은 `chapter-05/auth.js`에 새로 추가하고 기존의 API 호출을 `auth.js`의 함수로 감싸서 API 호출을 위한 엑세스토큰을 얻어와서 사용하도록 변경함. * 그 외 트위터가 반환하는 JSON객체의 포맷이 변경되어 응답으로 받은 데이터를 사용하는 필드명이 변경됨 * Jade 1.0 릴리즈 후 API 변경(6장, 8장) * 그동안 추가되고 변경되던 Jade의 기능이 1.0 릴리즈에서 폐기된 기능이 모두 사라져서 오류가 발생함 * Doctype을 `!!!` 대신 `doctype html`와 같이 사용함. * `script` 태그등에서는 뒷부분이 스크립트라는 의미로 마지막에 `.`을 추가해 주어야 함 * 그 외 모듈이 최신 버전으로 올라가면서 일부 API 변경 --- chapter-05/app1.js | 27 +++++--- chapter-05/app2.js | 47 ++++++++------ chapter-05/app3.js | 65 +++++++++++-------- chapter-05/app4.js | 65 +++++++++++-------- chapter-05/auth.js | 26 ++++++++ chapter-05/package.json | 2 +- chapter-06/joinin-mongodb/package.json | 2 +- .../joinin-mongodb/views/join-form.jade | 2 +- chapter-06/joinin-mongodb/views/layout.jade | 2 +- chapter-06/joinin-mysql/package.json | 4 +- chapter-06/joinin-mysql/repository.js | 2 +- chapter-06/joinin-mysql/views/join-form.jade | 2 +- chapter-06/joinin-mysql/views/layout.jade | 2 +- chapter-06/joinin/package.json | 2 +- chapter-06/joinin/views/join-form.jade | 2 +- chapter-06/joinin/views/layout.jade | 2 +- chapter-06/simpleweb/package.json | 2 +- chapter-06/simpleweb/views/layout.jade | 2 +- chapter-07/connect/package.json | 2 +- chapter-07/custom-event/package.json | 2 +- chapter-07/message/package.json | 2 +- chapter-07/namespace/package.json | 2 +- chapter-07/room/package.json | 2 +- chapter-07/volatile/package.json | 2 +- chapter-08/simple-chat/package.json | 4 +- chapter-08/simple-chat/views/enter.jade | 6 +- chapter-08/simple-chat/views/index.jade | 2 +- chapter-08/simple-chat/views/layout.jade | 2 +- chapter-08/simple-chat/views/makeRoom.jade | 6 +- chapter-08/simple-chat/views/room.jade | 4 +- 30 files changed, 178 insertions(+), 116 deletions(-) create mode 100644 chapter-05/auth.js 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 c7186ff..49faf21 100644 --- a/chapter-05/package.json +++ b/chapter-05/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "node-schedule": "~0.1.5" - , "restler": "~2.0.1" + , "restler": "~3.1.0" }, "devDependencies": {} } diff --git a/chapter-06/joinin-mongodb/package.json b/chapter-06/joinin-mongodb/package.json index f6da7ac..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": "~3.1.0", + "express": "~3.4.8", "jade": ">= 0.0.1", "mongolian": "~0.1.14" } diff --git a/chapter-06/joinin-mongodb/views/join-form.jade b/chapter-06/joinin-mongodb/views/join-form.jade index 8cb229f..ac9c3d9 100644 --- a/chapter-06/joinin-mongodb/views/join-form.jade +++ b/chapter-06/joinin-mongodb/views/join-form.jade @@ -10,7 +10,7 @@ block contents input(type='text', name='email', id='email') input(type='submit', value='전송') - script(type='text/javascript') + script(type='text/javascript'). $(document).ready(function() { $('#joinForm').submit(function(e) { if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { diff --git a/chapter-06/joinin-mongodb/views/layout.jade b/chapter-06/joinin-mongodb/views/layout.jade index 646abb0..c89f4e8 100644 --- a/chapter-06/joinin-mongodb/views/layout.jade +++ b/chapter-06/joinin-mongodb/views/layout.jade @@ -1,4 +1,4 @@ -!!! +doctype html html head title= title diff --git a/chapter-06/joinin-mysql/package.json b/chapter-06/joinin-mysql/package.json index 64073f1..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": "~3.1.0", + "express": "~3.4.8", "jade": ">= 0.0.1", - "mysql": "~0.9.6" + "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/join-form.jade b/chapter-06/joinin-mysql/views/join-form.jade index 8cb229f..ac9c3d9 100644 --- a/chapter-06/joinin-mysql/views/join-form.jade +++ b/chapter-06/joinin-mysql/views/join-form.jade @@ -10,7 +10,7 @@ block contents input(type='text', name='email', id='email') input(type='submit', value='전송') - script(type='text/javascript') + script(type='text/javascript'). $(document).ready(function() { $('#joinForm').submit(function(e) { if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { diff --git a/chapter-06/joinin-mysql/views/layout.jade b/chapter-06/joinin-mysql/views/layout.jade index 646abb0..c89f4e8 100644 --- a/chapter-06/joinin-mysql/views/layout.jade +++ b/chapter-06/joinin-mysql/views/layout.jade @@ -1,4 +1,4 @@ -!!! +doctype html html head title= title diff --git a/chapter-06/joinin/package.json b/chapter-06/joinin/package.json index 7129b3b..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": "~3.1.0" + "express": "~3.4.8" , "jade": ">= 0.0.1" } } diff --git a/chapter-06/joinin/views/join-form.jade b/chapter-06/joinin/views/join-form.jade index 8cb229f..ac9c3d9 100644 --- a/chapter-06/joinin/views/join-form.jade +++ b/chapter-06/joinin/views/join-form.jade @@ -10,7 +10,7 @@ block contents input(type='text', name='email', id='email') input(type='submit', value='전송') - script(type='text/javascript') + script(type='text/javascript'). $(document).ready(function() { $('#joinForm').submit(function(e) { if ($.trim($('#name').val()) === '' || $.trim($('#email').val()) === '') { diff --git a/chapter-06/joinin/views/layout.jade b/chapter-06/joinin/views/layout.jade index 646abb0..c89f4e8 100644 --- a/chapter-06/joinin/views/layout.jade +++ b/chapter-06/joinin/views/layout.jade @@ -1,4 +1,4 @@ -!!! +doctype html html head title= title diff --git a/chapter-06/simpleweb/package.json b/chapter-06/simpleweb/package.json index 7129b3b..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": "~3.1.0" + "express": "~3.4.8" , "jade": ">= 0.0.1" } } diff --git a/chapter-06/simpleweb/views/layout.jade b/chapter-06/simpleweb/views/layout.jade index c104427..f63f45a 100644 --- a/chapter-06/simpleweb/views/layout.jade +++ b/chapter-06/simpleweb/views/layout.jade @@ -1,4 +1,4 @@ -!!! +doctype html html head title= title diff --git a/chapter-07/connect/package.json b/chapter-07/connect/package.json index 3a18b49..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.9.13" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/custom-event/package.json b/chapter-07/custom-event/package.json index 3a18b49..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.9.13" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/message/package.json b/chapter-07/message/package.json index 3a18b49..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.9.13" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/namespace/package.json b/chapter-07/namespace/package.json index 3a18b49..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.9.13" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/room/package.json b/chapter-07/room/package.json index 3a18b49..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.9.13" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-07/volatile/package.json b/chapter-07/volatile/package.json index 3a18b49..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.9.13" + "socket.io": "0.9.16" }, "devDependencies": {}, "engines": { diff --git a/chapter-08/simple-chat/package.json b/chapter-08/simple-chat/package.json index ee8cf30..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": "~3.1.0", + "express": "~3.4.8", "jade": ">= 0.0.1", - "socket.io": "~0.9.13" + "socket.io": "~0.9.16" } } diff --git a/chapter-08/simple-chat/views/enter.jade b/chapter-08/simple-chat/views/enter.jade index f2b7547..5216419 100644 --- a/chapter-08/simple-chat/views/enter.jade +++ b/chapter-08/simple-chat/views/enter.jade @@ -13,13 +13,13 @@ block contents each room in roomList li= room input(type='button', value='입장', - onclick='location.href=\'/join/' + room + '\''); + onclick='location.href=\'/join/' + room + '\'') - else - if (nickname === '') - script(type='text/javascript') + script(type='text/javascript'). alert('잘못된 닉네임입니다.'); history.go(-1); - else - script(type='text/javascript') + 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 3893ab0..6afd757 100644 --- a/chapter-08/simple-chat/views/index.jade +++ b/chapter-08/simple-chat/views/index.jade @@ -7,7 +7,7 @@ block contents input(type='text', id='nickname', name='nickname') input(type='submit', value='입장') - script(type='text/javascript') + script(type='text/javascript'). $(document).ready(function() { $('form').submit(function(e) { if ($.trim($('#nickname').val()) === '') { diff --git a/chapter-08/simple-chat/views/layout.jade b/chapter-08/simple-chat/views/layout.jade index f434f74..d885edf 100644 --- a/chapter-08/simple-chat/views/layout.jade +++ b/chapter-08/simple-chat/views/layout.jade @@ -1,4 +1,4 @@ -!!! +doctype html html head title Simple Chat diff --git a/chapter-08/simple-chat/views/makeRoom.jade b/chapter-08/simple-chat/views/makeRoom.jade index 9136f83..048217b 100644 --- a/chapter-08/simple-chat/views/makeRoom.jade +++ b/chapter-08/simple-chat/views/makeRoom.jade @@ -2,14 +2,14 @@ extends layout block contents - if (isSuccess) - script + script. alert('방이 만들어졌습니다.'); location.href = '/join/#{roomName}'; - else if (roomName === '') - script + script. alert('방을 만들지 못했습니다.'); location.href = '/enter'; - else - script + script. alert('이미 존재하는 방입니다.'); location.href = '/enter'; diff --git a/chapter-08/simple-chat/views/room.jade b/chapter-08/simple-chat/views/room.jade index 45d54e3..24e5f23 100644 --- a/chapter-08/simple-chat/views/room.jade +++ b/chapter-08/simple-chat/views/room.jade @@ -2,7 +2,7 @@ extends layout block contents - if (!isSuccess) - script + script. alert('방에 입장할 수 없습니다.'); location.href = '/enter'; - else @@ -21,7 +21,7 @@ block contents input(type='text', style='width:300px;')#message input(type='submit', value='보내기') - script(type='text/javascript') + script(type='text/javascript'). $(document).ready(function() { var room = io.connect('/room'); var chatWindow = $('#chatWindow'); From 02b03be3456a6094d1a65b09261f28271d00f459 Mon Sep 17 00:00:00 2001 From: Outsider Date: Sat, 9 Feb 2013 19:51:01 +0900 Subject: [PATCH 4/6] =?UTF-8?q?node0.8=20=EB=B8=8C=EB=9E=9C=EC=B9=98?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A7=81=ED=81=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 13695a6..e5edc37 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Node.js 프로그래밍 : 클라우드 컴퓨팅 시대의 고성능 자바스 * 이 예제는 Node.js v0.8.14 기반으로 작성되었습니다. * 잘못된 부분을 발견하시면 이슈에 등록해 주세요. +* node 0.8.x 및 express 3.x와 관련한 오류가 발생하시는 분은 [features/node-0.8 브랜치](https://github.com/outsideris/node.js-programming/tree/features/node-0.8)를 참고해 주세요. ## 기존 소스에 비해서 주요 변경사항 From 38aa321bde0dc8b713aa7fa47a3905f7d03536aa Mon Sep 17 00:00:00 2001 From: Outsider Date: Mon, 27 Jan 2014 14:54:28 +0900 Subject: [PATCH 5/6] =?UTF-8?q?node-0.10=20=EB=B8=8C=EB=9E=9C=EC=B9=98?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EB=A7=81=ED=81=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e5edc37..9557eab 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Node.js 프로그래밍 : 클라우드 컴퓨팅 시대의 고성능 자바스 * 잘못된 부분을 발견하시면 이슈에 등록해 주세요. * node 0.8.x 및 express 3.x와 관련한 오류가 발생하시는 분은 [features/node-0.8 브랜치](https://github.com/outsideris/node.js-programming/tree/features/node-0.8)를 참고해 주세요. +* [features/node-0.10 브랜치](https://github.com/outsideris/node.js-programming/tree/features/node-0.10) : node v0.10.25 기준 및 의존성 모듈의 최신버전에 맞게 업데이트한 버전(Jade관련 오류가 수정되었습니다.) - [수정된 내용](https://github.com/outsideris/node.js-programming/commit/522b894abba1dabfe667bfe0df0deb42fe7d3a80) ## 기존 소스에 비해서 주요 변경사항 From da4f44e9297d52e434671e38f2ac6821972adb6f Mon Sep 17 00:00:00 2001 From: Outsider Date: Sun, 14 Feb 2016 17:28:19 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EC=B1=84=ED=8C=85=20=EC=98=88=EC=A0=9C?= =?UTF-8?q?=EB=A5=BC=20node=20v4,=20express=204.x,=20socket.io=201.4.x?= =?UTF-8?q?=EB=A1=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- chapter-08/simple-chat/app.js | 64 +++++++++++++++++-------- chapter-08/simple-chat/package.json | 9 ++-- chapter-08/simple-chat/rooms.js | 16 ++----- chapter-08/simple-chat/views/error.jade | 6 +++ 4 files changed, 59 insertions(+), 36 deletions(-) create mode 100644 chapter-08/simple-chat/views/error.jade diff --git a/chapter-08/simple-chat/app.js b/chapter-08/simple-chat/app.js index dcd004e..8f53a0b 100644 --- a/chapter-08/simple-chat/app.js +++ b/chapter-08/simple-chat/app.js @@ -3,34 +3,28 @@ * Module dependencies. */ -var express = require('express') - , http = require('http') +var http = require('http') + , path = require('path') + , express = require('express') + , cookieParser = require('cookie-parser') + , bodyParser = require('body-parser') + , session = require('express-session') , Chat = require('./chat'); var app = module.exports = express(); // Configuration +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'jade'); -app.configure(function(){ - app.set('views', __dirname + '/views'); - app.set('view engine', 'jade'); - app.use(express.bodyParser()); - app.use(express.cookieParser()); - app.use(express.session({secret: 'secret key'})); - app.use(app.router); - app.use(express.static(__dirname + '/public')); -}); - -app.configure('development', function(){ - app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); -}); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(cookieParser()); +app.use(session({secret: 'secret key'})) +app.use(express.static(path.join(__dirname, 'public'))); -app.configure('production', function(){ - app.use(express.errorHandler()); -}); // Routes - app.get('/', function(req, res){ res.render('index'); }); @@ -103,10 +97,38 @@ app.get('/join/:id', function(req, res) { }); }); +// error handlers +// 404 오류 +app.use(function(req, res, next) { + var err = new Error('Not Found'); + err.status = 404; + next(err); +}); + +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 + }); + }); +} + +app.use(function(err, req, res, next) { + res.status(err.status || 500); + res.render('error', { + message: err.message, + error: {} + }); +}); + + var server = http.createServer(app); server.listen(3000); +server.on('listening', function() { + console.log("Express server listening on port %d in %s mode", server.address().port, app.get('env')); +}); // Socket.io require('./rooms')(server); - -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 9961bfd..a156b55 100644 --- a/chapter-08/simple-chat/package.json +++ b/chapter-08/simple-chat/package.json @@ -3,8 +3,11 @@ "version": "0.0.1", "private": true, "dependencies": { - "express": "~3.4.8", - "jade": ">= 0.0.1", - "socket.io": "~0.9.16" + "body-parser": "^1.15.0", + "cookie-parser": "^1.4.1", + "express": "^4.13.4", + "express-session": "^1.13.0", + "jade": "^1.11.0", + "socket.io": "^1.4.5" } } diff --git a/chapter-08/simple-chat/rooms.js b/chapter-08/simple-chat/rooms.js index 3a3179d..3e864ef 100644 --- a/chapter-08/simple-chat/rooms.js +++ b/chapter-08/simple-chat/rooms.js @@ -1,17 +1,9 @@ var Chat = require('./chat'); -module.exports = function(app) { - var io = require('socket.io').listen(app); - - io.configure(function(){ - io.set('log level', 3); - io.set('transports', [ - 'websocket' - , 'flashsocket' - , 'htmlfile' - , 'xhr-polling' - , 'jsonp-polling' - ]); +module.exports = function(server) { + var io = require('socket.io')(server, { + transports: ['polling', 'websocket'], + allowUpgrades: true }); var Room = io diff --git a/chapter-08/simple-chat/views/error.jade b/chapter-08/simple-chat/views/error.jade new file mode 100644 index 0000000..51ec12c --- /dev/null +++ b/chapter-08/simple-chat/views/error.jade @@ -0,0 +1,6 @@ +extends layout + +block content + h1= message + h2= error.status + pre #{error.stack}