Node.js를 기반으로 채팅 응용 프로그램을 만들려고합니다. 나는 ExpressJS 세션 시스템을 사용하여 websocket 서버 (ws 라이브러리)를 강제하고 싶습니다. 불행히도, 나는 붙어있어. 세션의 데이터를 가져 오는 데 사용되는 MemoryStore 해시가 쿠키의 세션 ID와 다릅니다. 누군가 내가 뭘 잘못하고 있는지 설명해 줄 수 있니?ExpressJS 및 웹 소켓 및 세션 공유
웹 소켓 서버 코드 부분 :
module.exports = function(server, clients, express, store) {
server.on('connection', function(websocket) {
var username;
function broadcast(msg, from) {...}
function handleMessage(msg) {...}
express.cookieParser()(websocket.upgradeReq, null, function(err) {
var sessionID = websocket.upgradeReq.cookies['sid'];
//I see same value in Firebug
console.log(sessionID);
//Shows all hashes in store
//They're shorter than sessionID! Why?
for(var i in store.sessions)
console.log(i);
store.get(sessionID, function(err, session) {
websocket.on('message', handleMessage);
//other code - won't be executed until sessionID in store
websocket.on('close', function() {...});
});
});
});
}
저장소 개체 정의 :
var store = new express.session.MemoryStore({
reapInterval: 60000 * 10
});
응용 프로그램 구성 : 주요 코드의
app.configure(function() {
app.use(express.static(app.get("staticPath")));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
store: store,
secret: "dO_ob",
key: "sid"
}));
});
부 :
var app = express();
var httpServer = http.createServer(app);
var websocketServer = new websocket.Server({server: httpServer});
httpServer.listen(80);
샘플 디버깅 출력 :
- websocket.upgradeReq.headers.cookie "sid=s%3A64a%2F6DZ4Mab8H5Q9MTKujmcw.U8PJJIR%2BOgONY57mZ1KtSPx6XSfcn%2FQPZ%2FfkGwELkmM"
- websocket.upgradeReq.cookies["sid"] "s:64a/6DZ4Mab8H5Q9MTKujmcw.U8PJJIR+OgONY57mZ1KtSPx6XSfcn/QPZ/fkGwELkmM"
- i "64a/6DZ4Mab8H5Q9MTKujmcw"
간단하고 추한 해결하는 데 도움이 : sessionID와 = sessionID.match (/ : [A-ZA-Z0-9/+] + \ ./) [0]. 슬라이스 (1, -1),하지만이 문제를 해결하고 싶습니다. – skorczan
해결 방법을 제공해 주셔서 감사합니다. :) 이것에 대한 적절한 해결책을 찾았습니까? – Tim