노드제이에스 프로그래밍 - 변정훈, 에이콘
2장 노드 프로그래밍 시작
js 파일 하나가 모듈이다.
기본적으로 모듈간 접근이 불가하다.
예외적으로 모듈간 접근을 하기 위해 module.exports 에 객체를 공유시키고, require('sample.js')로 해당 모듈을 불러올 수 있다.
module.exports = {}, exports = {} 같은 방식이다.
callback 함수는 비동기다. 싱글스레드이므로 현재 스레드가 동작중이면, 아무리 callback이라 하더라도 대기해야 한다.
웹브라우저별로 동작하는 방식이 다르지만, Transfer-Encoding을 chunked로 하면, res.write('text') 로 할때마다 res를 날린다. res.end('text') 가 마지막 res이다.
(그런데 크롬에서는 일반방식으로 동작된다.)
require()를 사용할 때 파일명이 ./ 나 ../로 시작하면 상대 경로로 자바스크립트 파일을 찾는다.
./나 ../로 시작하지 않으면 기본 모듈이나 확장 모듈에서 찾는다.(임의 js는 찾지 못함)
3장 노드의 기본 모듈
기본 모듈 : 노드에 포함된 모듈
확장 모듈 : 추가로 설치해서 사용하는 모듈
4장 npm을 이용한 위존성 확장 모듈 관리
노드 0.6.3 버전부터 npm이 노드에 포함되어서 따로 설치할 필요 없음.
글로벌 설치 : npm install nodemon@0.5.7 -g
> 커맨드 라인에서 사용하는 경우
> 설치 장소 : C:\Users\Administrator\AppData\Roaming\npm
로컬 설치 : (프로젝트의 ROOT폴더) npm install express
> 소스에서 사용하는 확장모듈 require(...)
> 설치 장소 : 프로젝트 내 node_modules 폴더 하위에...
버전별 설치 : npm install express@2.5.2
nodemon : 자바의 핫디플로이 효과를 가져온다.
> 사용법 : nodemon app.js 로 실행.
*간편한 방법 :
1.프로젝트의 ROOT폴더에 package.json을 만들어서 해당하는 모듈의 버전을 기록
2.프로젝트의 ROOT폴더에서 npm install 을 실행하면, 자동으로 모든 모듈을 다운로드 해줌.
{
"name": "application-name"
, "version": "0.0.1"
, "private": true
, "dependencies": {
"express": "2.5.2"
, "jade": "0.9.1"
, "mysql":"0.9.5"
}
}
3.반대로, npm init 을 하면, 현재 설치된 확장모듈 리스트를 package.json 파일로 만들어줌.
설치된 로컬 확장모듈 확인하기 : 프로젝트의 ROOT폴더에서 npm list 명령어 실행
설치된 글로벌 확장 모듈 확인하기 : 아무대서나... npm list -g 실행
*테스트 버전 정보
node.js : 0.6.6
express : 2.5.2
jade : 0.9.1
mysql : 0.9.5
socket.io : 0.9.2
7장 리얼타임 웹사이트를 위한 Socket.IO
1회 전송
socket.send - 전송코드명 : message
수신할 때 message 라는 코드명으로만 받아야 한다.
json 전송시 socket.json.send 이용
전송성공 여부를 직접 알 수 있음.
socket.emit - 전송코드명 : 정하기 나름 (다양하게...)
수신할 때 정했던 이름으로 받으면 된다.
json 전송시 그냥 보내면 됨.
전송성공 여부를 수신측에서 실행해줘야 알 수 있음.(수신측에서 파라메터를 던질 수 있음)
타이머를 이용해서 여러번 보낼 수 있음
socket.volatile.emit
이웃에게 보낼 수 있음(서버쪽에서만 가능함)
socket.broadcast.send
socket.broadcast.emit
socket.braodcast.volatile.send
socket.broadcast.volatile.emit
네임스페이스
하나의 페이지에서 여러개의 네임스페이스를 만들어서 소켓통신을 작업별로 분류할 수 있다.
방 기능
socket.join('some room'); //방 들어가기
socket.leave('some room'); //방 나가기
네임스페이스 안에서, broadcast - send, emit을 할때 임의의 사용자를 선택할 수 있다.
//나 제외
socket.broadcast.to('룸 이름').emit
socket.broadcast.to('룸 이름').send
//네임스페이스와 별개로 모든 사용자에게 보내기(나 포함)
io.socket.send
io.socket.emit
//나포함
io.sockets.in("방이름').send
io.sockets.in("방이름').emit
8장 익스프레스와 Socket.IO를 이용한 SImple Chat 예제
{
"name": "application-name"
, "version": "0.0.1"
, "private": true
, "dependencies": {
"express": "2.5.2"
, "jade": "0.18"
, "socket.io": "0.9.2"
}
}
jade 버전이 낮으면, ????? 확실하지 않다. 소스에 오타가 많아서-__-;;
*.jade 파일내의
다음 문법에서 에러난다. room is not defined....
ul
each room in roomList
li=room