Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.

Guest Book

  1. 답변 감사합니다.^^

    앞으로 종종 찾아 뵙겠습니다. 좋은 하루 되세요.

  2. 질문 드릴게 있어서 방명록에 남김니다.

    var http = require('http')
    , fs = require('fs')
    , path = require('path')
    , io = require('socket.io');

    var server = http.createServer(function(req, res) {
    var filename = path.join(process.cwd(), req.url);

    fs.exists(filename, function(exists) {
    if(!exists) {
    res.writeHead(404, {"Content-type": "text/plain"});
    res.write("404 Not Found\n");
    res.end();
    return;
    }
    fs.readFile('./index.html'
    , encoding='utf-8'
    , function(err, data) {
    if(err) {
    res.writeHead(500, {"Content-Type": "text/plain"});
    res.write(err + "\n");
    res.end();
    return;
    }
    res.writeHead(200, {
    "Content-Type": "text/html; charset=utf-8"
    });
    res.end(data);
    });
    });
    });

    server.listen(3000);

    io = io.listen(server);

    //io.configure(function() {
    // io.enable('browser client etag');
    // io.set('log level', 3);
    // io.set('transports', [
    // 'websocket'
    // , 'flashsocket'
    // , 'htmlfile'
    // , 'xhr-polling'
    // , 'jsonp-polling'
    // ]);
    //});

    // socket.IO 로직을 작성할 부분
    io.sockets.on('connection', function(socket) {
    console.log('connected');
    socket.on('disconnect', function() {
    console.log('Good-bye');
    });

    socket.on('message', function(msg) {
    console.log(msg);
    socket.send('서버 쪽 메시지 테스트');
    });

    socket.send('send로 보내는 메시지', function() {
    console.log('메시지가 전달되었습니다.');
    });

    socket.on('from client', function(data) {
    console.log(data.text);
    socket.emit('from server'
    , {text:'서버에서 보낸 emit'}
    , function(res) {
    console.log('from server 이벤트:' + res);
    });
    });
    });

    var another = io.of('/another').on('connection'
    , function(socket) {
    socket.send('another 네임스페이스로 보낸 send 메시지');

    socket.on('nickname', function(nickname) {
    socket.set('nickname', nickname, function() {
    console.log('닉네임이 저장됐습니다.');
    });
    socket.get('nickname', function(err, nickname) {
    socket.emit('nickname', '닉네임: ' + nickname);
    });
    });

    socket.on('joinroom', function(msg) {
    console.log(msg);
    socket.join('some room');
    });

    socket.on('leaveroom', function(msg) {
    console.log(msg);
    socket.leave('some room');
    });

    var timer = setInterval(function() {
    var time = new Date();
    socket.broadcast.to('some room').emit('in room', time);
    }, 2000);
    });

    console.log("서버가 시작됐습니다. http://localhost:3000");

    node.js프로그래밍책 7장의 server.js 내용 전체인데요.

    일단 path.exists는 찾아보니 fs.exists하면 오류없이 넘어가서 fs.exists로 바꾸고,

    io.configure부분도 path.exists처럼 "undefined is not a function" 에러가 나서

    io.configure부분을 전체 주석처리 했습니다.

    질문 1. io.configure에서 "undefined is not a function" 에러가 발생하는 이유가 궁금합니다.

    (configure가 존재하지 않아서 undefined인거 같은데 어떻게 바꾸어야할지 모르겠습니다.)

    질문 2. io.sockets.on('connection', function(socket) { 이 부분으로 클라이언트와 1:1로 연결해서

    socket.send('send로 보내는 메시지', function() {

    console.log('메시지가 전달되었습니다.');

    }); 이부분을 통해 메시지를 보내고 콜백함수에 console.log로 확인하는거 같은데

    node server 실행후 화면에서 메시지가 전달되었습니다. 라는 콘솔이 나오지 않습니다.

    웹에서 <div>태그 안에 'send로 보내는 메시지'는 출력되는데 말이죠.

    혹시 제가 실수한 부분이 있는지 잘 모르겠습니다.

    질문 3. var another = io.of('/another').on('connection', function(socket) {

    부분이 전부 인식이 되지 않는것 같습니다.

    console.log('another-connected');를 추가해 보았는데 콘솔에 출력이 안되는것을 확인했습니다.

    웹페이지와 콘솔에 another에서 보내는 부분은 전부 출력이 안되구요.

    ※ 주변에 node.js를 피드백 받을 사람이 없어서 인터넷 검색을 해보는데 영어로는 원하는 결과를 찾는게

    어려워서 책에 있는 저자님 블로그에 직접 방문하게 되었습니다. 도움 주시면 감사하겠습니다.

    1. 추가로 질문 드릴게 있어서 덧글에 남깁니다.
      npm install express랑 -g 둘다 햇는데 cmd 창에서 express simple-chat하면 실행할 수 없다고 합니다.

      이럴 경우 어떻게 해야 되나요 ?

    2. 안녕하세요. 그동안 노드쪽 버전이 달라진 부분이 많아서 고생이 많으시네요

      질문 1. io.configure에서 "undefined is not a function" 에러가 발생하는 이유가 궁금합니다.

      위 오류를 보니 socket.io 0.9.x가 아니라 1.x를 쓰시는 듯 합니다. 책의 예제는 0.9.x 기반으로 되어 있지만 1.x에서는 API가 달라져서 `configure` 함수가 없어졌고 다음과 같이 socket.io에 HTTP 서버 객체를 전달할 때 옵션객체로 전달하게 됩니다. ( http://socket.io/docs/migrating-from-0-9/#configuration-differences 를 참고하세요. )

      var io = require('socket.io')(server, {
      transports: ['polling', 'websocket'],
      allowUpgrades: true
      });

      질문 2

      전달 확인 콜백을 사용하려면 클라이언트 쪽에서 콜백을 받아서 실행해 주어야 합니다. send는 클라이언트가 `message` 이벤트로 받으므로 다음과 같이 callback을 받아서 실행해야 합니다.

      socket.on('message', function(msg, callback) {
      printMessage(msg);
      callback('success');
      });

      질문 3에 대해서는 저는 주신 코드로 했을 때 another쪽이 전부 실행되는데 클라이언트에 var another = io.connect('http://localhost:3000/another'); 같은 연결 코드가 있는지 확인 부탁드립니다.

      그리고 보고 계신지 모르겠지만 https://github.com/outsideris/node.js-programming/tree/features/node-0.10 를 보시면 노드 0.10 버전에 맞게 갱신된 부분이 있으므로 따라하시는데 좀더 도움이 될 겁니다.(socket.io는 1.0 버전은 아닙니다.)

    3. express 관련해서는 현재 버전의 express는 글로벌로 설치해서(-g) 프로젝트 초기화하는 기능이 사라졌습니다. 이 기능은 express-generator ( https://github.com/expressjs/generator/ )로 분리가 되었으므로 npm install -g express-generator로 설치하면 동일하게 사용할 수 있습니다.

  3. 관리자만 볼 수 있는 방명록입니다.

    1. 안녕하세요. 그 글도 벌써 꽤 오래전의 글이군요. 공감을 많이 하셨다니 다행이네요.
      말씀하신 내용을 보니 제가 취업할때보다 저보다 경험도 훨씬 많으시고 잘하시는 걸로 보입니다. 이 블로그가 개발자로써 제가 걸어온 자취이긴 합니다만 말씀하신 내용은 꽤 많은 내용이라 댓글로 다 말하기가 쉽지 않긴 하네요 ^^ 나중에 또 생각하면 여러가지가 나올지 모르겠지만 지금 드는 생각을 적어보면서..

      지금와서 생각해 보면 개발이 재밌었던게 제일 컸던것 같습니다. 재밌으니가 더 잘하고 싶고 궁금한것도 많고 하니까 시간내서 한번이라도 더 해보게 되고 재미있으니까 또 별로 지치지도 않고 했던것 같아요.
      그리고 전 커뮤니티 활동을 시작했던게 큰 전환점 중 하나라고 보고 있습니다. 스터디 모임나가면서 커뮤니티 활동을 했는데 거기서 대단한 개발자들도 많이 만나고 같이 어울리고 하다보니 배우는 점도 많으면서 자극도 많이 받아서 동기부여도 되고 친해지고 나니 궁금한거나 토론거리 얘기하기도 더 쉬워지고 했던것 같네요. 지금도 커뮤니티활동을 대부분의 개발자에게 추천하는 편입니다.
      매년 적는 회고글을 보시면 아시겠지만 코딩을 잘 못한다는 고민은 계속해서 하곤 합니다. 저는 이런 부분은 몇년전부터는 개인프로젝트로 수행했고 회사에서 하지 못하는 기술셋이나 경험을 개인프로젝트에서 얻었습니다. 거기서 오픈소스쪽까지 조금씩 관심가지다 보니 몇년 전보다는 많이 참여하는 부분이 늘어났고요.

      관련해서 적은 글이랑 슬라이드가 있는데 보셨는지 모르겠지만 참고하시면 좋을듯 합니다.
      http://blog.outsider.ne.kr/500
      http://www.slideshare.net/rockdoli/frends-meetup

  4. 관리자만 볼 수 있는 방명록입니다.

    1. 안녕하세요 반갑습니다. ^^
      이메일주소는 outsideris@쥐메일이지만 제가 현재 프로젝트 진행중인 부분이 있어서 참여하기는 어려울것 같습니다.

  5. 안녕하세요.
    블로그 내용을 보며 많은 도움 얻고 있습니다.
    고맙습니다.


    다름이 아니라 node.js 서버에서도 apache 처럼 indexOf 를 출력시키는 방법이 있나요?
    즉, 어떤 디렉토리의 목록을 리스트로 보여주는 화면 입니다.


    아무리 검색을 해봐도 안나와서 질문 드립니다.

    추운데 감기 조심하세요-

    1. node.js로 웹서버처럼 구현하려면 직접 로직을 작성해주어야 합니다. 예를 들어 아파치에서 www같은 경로에서 fs.readdir로 폴더 안의 내용을 읽어와서 루프를 돌면서 디렉토리와 파일을 구분해서 보여준다던지 하는 로직을 작성해야 합니다.

  6. 안녕하세요. 좋은 글이 많네요. 앞으로 자주 들르겠습니다. 좋은 하루 보내세요 :)

    1. 오랜만에 방명록에 글을 남겨주셨네요. ^^ 방문해주셔서 감사합니다. 좋은 하루되세요.