-
-
모던 웹을 위한 Node.js 프로그래밍 - 개정판, 페이스북, 월마트, 링크드인이 선택한 자바스크립트 + 노드제이에스 서버 프로그래밍
윤인성 지음 / 한빛미디어 / 2013년 9월
평점 :
구판절판
Node.js 입문자들에게 좋은 책일 듯 싶다.
기본적인 내용들을 쉬운 예제로 설명한다.
이른바 MEAN 스택 관련된 책을을 보면
이해하기 어려운 책들이 많다.
입문자를 위한 기본적인 내용에 대한 설명은 간략하고
기타의 툴(?)이나 라이브러리, 프레임워크에 대한 내용들이 많아서
가장 기본적이고 핵심적인 내용을 빠르게 습득하고자 하는
입문자에게 부적절한 경우가 많은 것 같다.
기타의 여러 가지 의존 프로그램들과 부가적인 내용들을
책과 별도로 인터넷으로 공부해야만 책의 내용을 소화할 수 있는 경우가 많은 것 같다.
일단, 책을 통해서 기본과 핵심만 빠르고 쉽게 익히고자 하는
(나 같은) '게으른' 입문자로 하여금
책을 집어 던지게 만드는,
입문자에게는 부적절한 그런 책들이 많는 것 같다.
이 책은 그런면에서 입문자에게 훌륭하다.
그러나 2015년 9월 현재에는 node.js 입문자들에게 치명적인 약점을 가지고 있다.
8장부터 나오는 express의 버전업으로 인해서,
이 책의 8장 이후의 예제들은 거의 정상 동작하지 않는 단점을 가지고 있다.
내 개인적인 생각으로는
책의 저자가 별도의 웹 페이지 또는 출판사 사이트를 통해서
8장의 변화된 내용에 대한 보충 설명을 배포 했었어야 한다고 생각한다.
저자, 출판사 모두 책임의식이 부족하다는 생각이 든다.
변경폭이 커다란 버전업을 반영하는 A/S는 부실하다고 생각하지만
그럼에도 불구하고 입문자에게는 추천할 만한 내용이라고 생각한다.
지금이라도 이 책으로 Node.js에 입문하고자 하는 사람이 있을 지 몰라
오타 및 내가 인터넷을 통해 찾아본 변경 사항들을 8장 위주로 간략하게 적는다.
8장 이후의 예제들은 8장의 변경 사항을 원용하면
정상 동작하는 걸 확인할 수 있다.
(2015년 9월 기준)
p144.
doctype 5 => doctype
p.172 logger (morgan 으로 대체).
$npm install morgan
var morgan = require('morgan'),
app.use(morgan('combined'));
p.178 router
app.use(app.router); 제거
p.182 cookieParser
$ npm install cookie-parser
cookieParser = require('cookie-parser')
app.use(cookieParser());
p.184 bodyParser
$npm install body-parser
var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
p.188 파일 업로드 (formidable로 대체)
npm install formidable@latest (node_modules 폴더로 이동해서 실행.)
formidable = require('formidable');
.post(function (request, response) {
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = 'multipart'; // 임시 파일이 생성될 디렉토리
form.keepExtensions = true; // 파일 확장자를 남길것인가.
form.maxFieldsSize = 2 * 1024 * 1024;
// 파일 업로드
form.parse(request, function(err, fields, files) {
response.redirect('/');
});
// 업로드 후처리
form.on('end', function(fields, files){
if(this.openedFiles){
if(this.openedFiles[0].type.indexOf('image') != -1){
// 파일 이름 변경
var outputPath = __dirname + '/multipart/' + Date.now() + '_' + this.openedFiles[0].name;
fs.rename(this.openedFiles[0].path, outputPath, function(error) {
response.redirect('/');
})
}else {
// 파일 제거
fs.unlink(this.openedFiles[0].path, function(error){
response.send(400);
})
}
}else {
response.send(400);
}
});
});
p. 194 session
$ npm install express-session
session = require('express-session');
app.use(session({
secret: 'secret key',
key:'rint',
cookie:{
maxAge:60 * 1000
}
}));
p.199
app.del => app.route('/user/:id').delete(
p. 236
[request.param('id')] => [request.params.id]
p.238 bodyParser 추가 해야 함,
bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }));
p.282
io.sockets.sockets[id].emit('smart', data); => io.sockets.connected[id].emit('smart', data);
p.284 get/set 메소드 사용 안 함.
set => socket.name = data;
get => socket.emit('responsename', socket.name);
p.290
socket.set('room', data) => socket.room = data;
p.291
io.sockets.in(socket.room).emit('message', data);