웹서버 생성
express 2.5에서는 웹서버를 다음과 같이 생성한다.
var express = require('express');
var app = express.createServer();
app.listen(3000, function(){ });
이 소스도 꽤 명확하다고 생각했는데 3.0에서는 웹서버를 생성하는 방식이 변경되어서 express 3.0을 설치하고 위의 소스를 사용하면 다음과 같은 경고문구가 나온다.
$ node app.js
Warning: express.createServer() is deprecated, express
applications no longer inherit from http.Server,
please use:
var express = require("express");
var app = express();
express.createServer()가 폐기되어서 다음과 같이 서버를 생성해야 한다. 소스는 약간 더 같단해 졌지만 2.5와 가장 다른 점은 여기서 생성한 app이 http.Server 객체가 아니라는 점이다.
var express = require('express');
var app = express();
app.listen(3000);
2.5때처럼 http.Server 객체가 필요하다면 다음과 같이 사용하면 된다.
var express = require('express')
, http = require('http');
var app = express();
http.createServer(app).listen(3000, function() { });
Socket.IO와의 연동
질문을 받아보니 Socket.IO와의 연동에서 가장 큰 문제가 되는 것 같다. 기존에는 다음과 같이 사용했다.
var io = require('socket.io').listen(app);
이 간단힌 코드만으로 express 웹서버와 Socket.IO를 연동할 수 있는데 express 3.0에서는 express()가 반환한 객체가 http.Server 객체가 아니기 때문에 이렇게 사용할 경우 Socket.IO에서 오류가 발생한다. 그래서 위에서 http.Server 객체를 생성하는 방법을 설명했듯이 http.Server를 생성해서 Socket.IO에 전달해야 한다.
var express = require('express')
, http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
Jade
Jade는 중복코드를 줄이기 위해서 Layout 방식과 Block 방식을 지원하는데 2.5에서는 Layout 방식을 기본으로 사용하고 있었다. (Block방식은 나중에 추가된 기능이다.) Layout 방식이라하면 layout.jade파일을 기본적인 공통파일로 두고 layout.jade 파일에 특정부분에 각 뷰파일을 끼워넣는 방식이다. Jade는 나중에 Django에서 가져온 Block을 이용한 상속방식을 추가했는데 사실 이 방식이 훨신 유연하고 사용하기가 편하다.(레이아웃 방식은 간단한 페이지를 괜찮지만 사이트가 좀 복잡해지면 엄청 불편해진다.) 그래서 Guillermo Rauch도 Use Jade blocks, not layouts라는 포스팅을 올렸다. 블락방식은 부모 Jade파일을 하나두고 각 블럭별로 오버라이드해서 쓸 수 있는데 가이드만 보면 사용할 수 있을 정도로 간단하다.
그 외에도 달라진 부분이 좀 있는데 메서드 부분이나 파라미터의 변경등이므로 마이그레이션 문서에서 확인할 수 있다. 이런 변형보다는 3.0에서 새롭게 추가된 것들이 좀 있어보이는데 3.0을 릴리즈하면서 개편한 express 홈페이지의 문서에서 확인할 수 있는데 솔직히 아직은 문서가 그리 자세하진 않다.(홈페이지는 이뻐졌지만...)
덧) 웹에서 제공하는 소스도 업데이트 해달라고 요청이 왔는데 이부분은 어떻게 할지 좀 고민중이다. node.js의 버전도 새버전이 나왔지만 심각한 호환성 문제는 없고 각 모듈의 버전업으로 인한 차이가 좀 더 영향이 큰데 모듈이 많아서 어떻게 할지 고민중이다. Github에 올려놓은 소스도 변경하면 책보고 하시는 분들이 오히려 헷갈릴테니까 바꾸기도 쉽지 않다. 현재 생각으로는 브랜치를 따서 새버전용으로 변경하는 것이 가장 나아보인다. 하지만 대부분 Github에 그리 익숙하지 않은데다가 모듈에 따라 일일이 업데이트하는것도 만만치 않은 작업이라 좀 고민 중에 있다.
오, 얼마전에 채팅 예제 수정요청 드렸었는데 이렇게 포스팅으로 올리셨네요^^ 잘봤습니다 메일 답변도 감사드리구요!^^ 수시로 들러서 좋은정보 얻어가겠습니다!
이슈로 올려주신 분이군요? ㅎㅎ
Socket.IO 1.0까지만 나오면 새로 테스트해서 브랜치를 만들어야 겠어요..
지금은 여유가 좀 안되서요 ^^
본문과는 좀 다른 질문하나 드릴꼐요..ㅜㅜ
몇일전에 (가장최근버전일듯) 홈페이지를 통해서 노드와 npm울깔았는데
(사용기종은 맥북입니다) npm install -g express 하면 오류가 나거
구글링을 통해 sudo npm install -g express 이런식으로 깔았는데 문제가 없는 건가요?
제가 코딩공부한지 얼마 안되서 sudo가 어렴풋이 권한 문제라고 생각하는 수준이네요..sudo 명령문 안쓰고 그냥 npm install -g express로 깔수 있게 하려면 어떤 설정이 필요 할까요?
그리고 npm install express 하면(글러벌 옵션을 아넣은경우)는 잘 깔리다가
json.xxx(지금 백북이 없어서 파일이름이...) 에서 오류가 나는데 npm ls로 확인하면
깔리긴 했더라구요...jon.xxx이 오류는 어떻게 해야 없어지는 걸까요? ㅜㅜ
본문과 상관 없는 댓글을 달아 죄송합니다..몇일
sudo로 까는건 권하지 않는 방법입니다.
npm을 따로 설치하지는 않으신 신듯하니 node가 설치된 위치에 있을 것이고 글로벌 설치는 npm의 위치를 기준으로 설치가 되는데 해당 폴더에 권한이 없는것 같습니다. sudo로는 되신다는거 보면 맞는것 같습니다. chown이나 chmod로 적절한 권한을 주시면 sudo 없이 사용할 수 있습니다.
json.xx 관련 오류는 내용을 보기전엔 어떤 이유인지 모르겠습니다. 당그리님의 PC 환경문제일 수도 있고 json 모듈을 배포한 사람이 뭔가 잘못 배포해서일 수도 있습니다.