2016-01-15 11 views
10

जारी नहीं है मैं एक चैट एप्लिकेशन में Socket.io का उपयोग कर रहा हूं। मैं सत्र स्थापित करने की कोशिश कर रहा हूं ताकि मैं सत्रों के बीच उपयोगकर्ताओं के लॉगिन को जारी रख सकूं।सॉकेट आईओ केवल सत्र

यहाँ प्रासंगिक कोड है:

index.js (सर्वर)

var cookieParser = require('cookie-parser')(); 
var session = require('cookie-session')({ secret: 'secret' }); 

app.use(cookieParser); 
app.use(session); 

io.use(function(socket, next) { 
    var req = socket.handshake; 
    var res = {}; 
    cookieParser(req, res, function(err) { 
     if (err) return next(err); 
     session(req, res, next); 
    }); 
}); 


io.on('connection', function(socket){ 

    socket.on('test 1', function(){ 
     socket.handshake.test = 'banana'; 
    }); 

    socket.on('test 2', function(){ 
     console.log(socket.handshake.test); 
    }); 
}); 

chat.js (ग्राहक)

var socket = io(); 

socket.emit('test 1'); 
socket.emit('test 2'); 

कोड काम करता है ऊपर, यह अपेक्षित कंसोल पर banana प्रिंट करें। हालांकि, अगर मैं बाहर 'परीक्षण 1' तो जैसे टिप्पणी:

var socket = io(); 

// socket.emit('test 1'); 
socket.emit('test 2'); 

यह कंसोल के लिए undefined प्रिंट होगा।

क्या यह अभी भी banana प्रिंट करने में सक्षम नहीं होना चाहिए, क्योंकि यह सत्र का उपयोग कर रहा है और यह अनुरोधों के बीच जारी है? अगर मैं उस आदेश को उलटा करता हूं जिसमें मैं 'टेस्ट 1' और 'टेस्ट 2' कहता हूं तो मैं भी उसी मुद्दे पर चलता हूं।

मैं क्या गलत कर रहा हूं? उम्मीद के मुताबिक सत्र के लिए मुझे क्या याद आ रही है?

+0

'socket.handshake.session.test = 'केला' का उपयोग करता है;' परीक्षण 1' और 'socket.handshake के लिए'। 'test 2' काम के लिए session.test'? –

उत्तर

5
समस्या

है कि आप एक cookie-session का उपयोग कर रहे है, और socket.io आप कुकीज़ XMLHttpRequest की वजह से विनिर्देश, यह भी आप एक वेब सॉकेट लेन-देन के बीच में एक request/response नहीं है, स्थापित करने के लिए अनुमति नहीं है तो आप नहीं कर सकते प्रतिक्रिया कुकी सेट करें।

अपने मिडलवेयर के साथ, आप कुकीज़ देख सकते हैं, लेकिन आप इसे socket.io में सेट नहीं कर सकते हैं। यह इस उदाहरण के साथ यह सुनिश्चित किया जा सकता है:

io.use(function(socket, next) { 
    var req = socket.request; 
    var res = req.res; 
    cookieParser(req, res, function(err) { 
     if (err) return next(err); 
     session(req, res, next); 
    }); 
}); 

io.on('connection', function(socket){ 
    var req = socket.request; 
    console.log(req.session.test) 

    socket.on('test 1', function(){ 
     req.session.test = 'banana'; 
    }); 

    socket.on('test 2', function(){ 
     console.log(req.session.test); 
    }); 
}); 

app.get('/', function(req, res) { 
    console.log(req.session.test) 
    if (!req.session.test) { 
     req.session.test = 'banana request' 
    } 
})  

आप सत्र दृढ़ रहना करने के redis की तरह कुछ का उपयोग कर सकते हैं, या कुछ हाथ मिलाना में यह स्थापित करने के लिए 'हैक'।

एक और विकल्प सत्र का उपयोग नहीं करता है, और बस socket ऑब्जेक्ट में या किसी अन्य जावास्क्रिप्ट ऑब्जेक्ट में संपत्ति सेट करें, लेकिन इस मामले में आप ऑब्जेक्ट को सर्वर/सेवाओं के बीच साझा नहीं कर सकते हैं।

1
  1. अभी भी हेडर तक पहुंच है।
  2. आप प्रत्येक सॉकेट के लिए सर्वर पक्ष पर डेटा सहेज सकते हैं: socket.my_value = "कोई डेटा प्रकार";
  3. आप io.sockets ऑब्जेक्ट में डेटा सहेज सकते हैं, io।MY_VALUE = "किसी भी डेटा प्रकार"

तो, उदाहरण के:

io.on('connection', function(socket){ 
     var id = socket.handshake.query.id; //you can set this in client connection string http://localhost?id=user_id 
     //Validate user, registered etc. and if ok/ 
     if(validateUser(id)) { 
      //if this is reconnect 
      if(io.sessions[id]) { 
       socket.session_id = io.sessions[id].session_id; 
      } else { 
       var session_id = random_value; 
       socket.session_id = some_random_value; 
       io.sessions[id] = { 
       user_id: id, 
       session_id: socket.session_id 
       }; 
      } 

      registerEvent(socket); 
     } else { 
      socket.emit('auth_error', 'wrong user'); 
     } 
    }); 


function registerEvent(socket) { 
    socket.on('some_event', function(data, callback) { 
     if(!socket.session_id) { 
     callback('unathorized');//or emit 
     socket.emit('auth_error', 'unauthorized'); 
     } 

     //do what you want, user is clear 
    }); 
} 
संबंधित मुद्दे