2013-10-12 2 views
0

내 웹 사이트에서 인스턴트 채팅 기능을 지원하기 위해 백엔드로 사용하는 노드 익스프레스 서버가 있습니다. 내가 가진 문제는 누군가가 브라우저를 닫을 때 친구의 친구 목록에서 친구의 상태가 '오프라인'으로 업데이트되지 않는다는 것입니다. 나는 노드에 req.on ('close', function() {})이라는 함수가 있다는 것을 알고있다. 하지만 내 서버 파일에 포함시키는 방법을 모르겠습니다. 올바른 방향의 힌트를 주시면 감사하겠습니다. 다음은 관련성이 있다고 생각되는 명시적인 서버 코드의 일부입니다.사용자가 고속 서버와 연결을 끊을 때를 어떻게 알 수 있습니까?

var app = express(); 
app.use(express.methodOverride()); 
app.use(express.cookieParser()); 
app.use(express.bodyParser());  
app.use(function(req, res, next) { 
res.header("Access-Control-Allow-Origin", "*"); 
res.header("Access-Control-Allow-Headers", "X-Requested-With"); 
next(); 
}); 

app.use(require('./middleware/im')({ 
maxAge: 60 * 1000, 
reapInterval: 60 * 1000, 
    authentication: require('./libs/authentication/' + AUTH_LIBRARY) 
})); 


    app.set('root', __dirname); 

// Listener endpoint; 미들웨어에서 처리 됨 app.get ('/ listen', function() {});

app.post('/message', function(req, res) { 
    res.find(req.body['to'], function(user) { 
     if(!user) 
      return res.send(new packages.Error('not online')); 
     res.message(user, new packages.Message(
     req.session.data('username'), 
     req.body.body 
    )); 


}); 

});

app.post('/message/typing', function(req, res) { 
if(~packages.TYPING_STATES.indexOf('typing' + req.body['state'])) { 
    res.find(req.body['to'], function(user) { 
     if(user) { 
      res.message(user, new packages.Status(
       req.session.data('username'), 
       'typing' + req.body.state 
      )); 
     } 

     // Typing updates do not receive confirmations, 
     // as they are not important enough. 
     res.send(''); 
    }); 
} else { 
    res.send(new packages.Error('invalid state')); 
} 

});

app.post('/status', function(req, res) { 

if(~packages.STATUSES.indexOf(req.body['status'])) { 
    res.status(req.body.status, req.body.message); 
    res.send(new packages.Success('status updated')); 
} else { 
    res.send(new packages.Error('invalid status')); 
} 
}); 



    app.post('/clear', function(req, res) { 

    app.use(require('./middleware/im')({ 
     clear: req.sessionID, 
     maxAge: 60 * 1000, 
    reapInterval: 60 * 1000, 
    authentication: require('./libs/authentication/' + AUTH_LIBRARY) 
})); 
    req.sessionID = null; 
res.send(new packages.Success('cleared session')); 
app.use(require('./middleware/im')({ 
    clear: 0, 
     maxAge: 60 * 1000, 
     reapInterval: 60 * 1000, 
    authentication: require('./libs/authentication/' + AUTH_LIBRARY) 

})));

});

app.post('/online', function(req, res) { 
var d = new Date(); 
    var n = d.getTime() + 60; 
req.sessionID.expires = n; 
res.status(req.body.status, 'available'); 
    res.send(new packages.Success('Online')); 

});

app.post('/signoff', function(req, res) { 
res.signOff(); 
res.send(new packages.Success('goodbye')); 

});

https.createServer(options, app).listen(8000); 

답변

2

HTTP는 상태 비 저장 프로토콜이므로 '연결된 사용자'라는 개념이 없습니다. 사용자가 탐색 할 때 서버에 알리기 위해 일종의 클라이언트 측 메커니즘을 사용해야합니다 (메시지를 서버에 게시하는 onbeforeunload 핸들러 사용). 당신이 언급 한 close 이벤트는 당신이 어떤 종류의 긴 폴링 메커니즘을 사용하지 않는 한 유용하지 않습니다. (그러나 나는 당신이라고 생각하지 않습니다.)

채팅을 구현하려면 더 좋은 해결책은 브라우저와 서버 사이에 영구적 인 연결을 유지하고 브라우저가 연결을 종료했는지 알 수있는 메커니즘이 내장되어있는 것입니다 (사용자가 이동 한 경우 예).

+2

다음은 채팅에 'socket.io'를 사용하는 방법에 대한 설명입니다. http://net.tutsplus.com/tutorials/javascript-ajax/real-time-chat-with-nodejs-socket-io-and-expressjs/ 및 비디오 : http://www.youtube.com/watch?v=pNKNYLv2BpQ – KayakDave

+0

내 클라이언트 측 코드에서 Ajax 호출을 socket.io로 바꾸기가 어렵습니까? 나는 이것이 분명히해야 할 일이라고 생각한다. Socket.io는 훨씬 더 좋아 보인다. –

+0

@ArjunPatel은 AJAX 호출의 복잡성에 따라 다르지만 일반적으로 큰 문제는 아닙니다. – robertklep

관련 문제