Express 프레임 워크를 사용하고 있습니다. socket.io에서 세션 데이터에 도달하고 싶습니다. client.listener.server.dynamicViewHelpers 데이터로 express dynamicHelpers를 시도했지만 세션 데이터를 가져올 수 없습니다. 이를 수행하는 간단한 방법이 있습니까? 코드를 참조하십시오
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
답변
이것은 flashsocket 전송을 통과하는 소켓에 대해서는 작동하지 않지만 (서버에 필요한 쿠키를 보내지 않음) 다른 모든 것에 대해서는 안정적으로 작동합니다. 내 코드에서 flashsocket 전송을 비활성화했습니다.
작동하기 위해 Express / connect 측에서 세션 저장소를 명시 적으로 정의하여 소켓 내부에서 사용할 수 있습니다.
MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
app.use(express.session({ store: session_store }));
});
그런 다음 소켓 코드 내에 connect 프레임 워크를 포함하여 쿠키 구문 분석을 사용하여 쿠키에서 connect.sid를 검색 할 수 있습니다. 그런 다음 connect.sid가있는 세션 저장소에서 다음과 같이 세션을 찾습니다.
var connect = require('connect');
io.on('connection', function(socket_client) {
var cookie_string = socket_client.request.headers.cookie;
var parsed_cookies = connect.utils.parseCookie(cookie_string);
var connect_sid = parsed_cookies['connect.sid'];
if (connect_sid) {
session_store.get(connect_sid, function (error, session) {
//HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
});
}
});
그런 다음 필요에 따라 세션을 사용할 수 있습니다.
답변
답변
나는 바퀴를 완전히 재발 명하지 말 것을 제안합니다. 필요한 도구는 이미 npm 패키지입니다. 이것이 필요한 것이라고 생각합니다 : session.socket.io
요즘 사용하고 있으며 매우 도움이 될 것 같습니다 !! express-session을 socket.io 레이어에 연결하면 많은 이점이 있습니다!
답변
편집 : 작동하지 않는 일부 모듈을 시도한 후 실제로이 작업을 수행하기 위해 내 라이브러리를 작성했습니다. 뻔뻔한 플러그 : https://github.com/aviddiviner/Socket.IO-sessions 에서 확인 하세요 . 역사적인 목적으로 아래에 이전 게시물을 남겨 둘 것입니다.
위의 pr0zac 솔루션에 따라 flashsocket 전송 을 우회하지 않고도이 작업을 아주 깔끔하게 얻었습니다 . 나는 또한 Socket.IO와 함께 express를 사용하고 있습니다. 방법은 다음과 같습니다.
먼저 세션 ID를 뷰에 전달합니다.
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
그런 다음보기에서 Socket.IO 클라이언트 측에 연결합니다.
<script>
var sid = '<%= connect_sid %>';
var socket = new io.Socket();
socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>
그런 다음 서버 측 Socket.IO 리스너에서이를 선택하고 세션 데이터를 읽고 / 씁니다.
var socket = io.listen(app);
socket.on('connection', function(client){
client.on('message', function(message){
session_store.get(message.sid, function(error, session){
session.pings = session.pings + 1 || 1;
client.send("You have made " + session.pings + " pings.");
session_store.set(message.sid, session); // Save the session
});
});
});
제 경우 session_store
에는 redis-connect
라이브러리를 사용하는 Redis 입니다.
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
이것이 Google을 검색하는 동안이 게시물을 찾는 사람에게 도움이되기를 바랍니다.
답변
참조 : Socket.IO 인증
나는 통해 아무것도 가져 오는하지 제안 client.request...
또는 client.listener...
그 직접 부착되지 않는 client
개체를 항상 로그인 한 사용자의 마지막을 가리!
답변
Socket.IO-connect를 확인하십시오.
Socket.IO 노드 주위에 WebSocket 미들웨어 래퍼 연결
https://github.com/bnoguchi/Socket.IO-connect
이렇게하면 Socket.IO 이벤트 처리기로 처리하기 전에 Express / Connect 미들웨어 스택에서 Socket.IO 요청을 푸시하여 세션, 쿠키 등에 대한 액세스를 제공 할 수 있습니다. 비록 그것이 Socket.IO의 모든 전송과 함께 작동하는지 확신하지 못합니다.
답변
express-socket.io-session 을 사용할 수 있습니다 .
socket.io와 쿠키 기반의 익스프레스 세션 미들웨어를 공유하십시오. express> 4.0.0 및 socket.io> 1.0.0에서 작동하며 이전 버전과 호환되지 않습니다.
나를 위해 일했다!!