2016-09-01 10 views
12

साथ पार्स कुकीज़ मैं ठीक से मेरी नोड सर्वर है कि स्थानीय होस्ट पर ब्राउज़र कंसोल के माध्यम से मेरे द्वारा स्थापित किए गए थे पर कुकीज़ को पढ़ने के लिए कोशिश कर रहा हूँsocket.io

document.cookie = "tagname = test;secure"; 
document.cookie = "hello=1" 

मेरी नोड सर्वर में, मैं का उपयोग करें sockets.io, और जब मैं एक कनेक्शन अनुरोध मिलता है, मैं एक संपत्ति जो इस प्रकार है पहुँच सकते हैं:

socket.request.headers.cookie 

यह एक स्ट्रिंग है, और मैं हमेशा इस तरह यह देखें:

'io=QhsIVwS0zIGd-OliAAAA' //what comes after io= is random. 

मैंने इसे विभिन्न मॉड्यूल के साथ अनुवाद करने का प्रयास किया है लेकिन वे स्ट्रिंग को पार्स नहीं कर सकते हैं।

var cookie = require('cookie'); 

io.sockets.on('connection', function(socket) { 
    socket.on('addUser', function(){ 
     var a = socket.request.headers.cookie; 
     var b = cookie.parse(a); //does not translate 
     console.log(b); 
    }); 
}  

मैं स्पष्ट रूप से सभी कुकीज़ ब्राउज़र पर प्रत्येक io.connect द्वारा भेजा गया था के साथ एक वस्तु प्राप्त करना चाहते हैं: यह मेरा नवीनतम प्रयास है। मैं इसे 5 घंटे तक हल करने की कोशिश कर रहा हूं और मुझे नहीं पता कि मैं यहां क्या कर रहा हूं।

+0

ग्राहक क्या है? मैंने कुछ भी नहीं कहा जिसे "क्लाइंट" कहा जाता है। जब मैं उस पंक्ति को पेस्ट करता हूं तो मुझे "क्लाइंट परिभाषित नहीं किया जाता है" – user1938653

+0

क्षमा करें, कृपया –

+0

@ user1938653 को अनदेखा करें, आप यूआरएल में क्लाइंट से सर्वर पर ऑब्जेक्ट भी भेज सकते हैं (io.connect ('localhost: 3000?{key: value} ')), बैकएंड पर, आप सॉकेट मिडलवेयर में यूआरएल से ऑब्जेक्ट प्राप्त कर सकते हैं। – KlwntSingh

उत्तर

1

बजाय socket.request की socket.handshake का उपयोग कर

+0

बस किया, मैं एक ही प्रारूप में कुछ देखता हूं जिसका अर्थ है कि यह वही है। – user1938653

7

उपयोग Cookie मॉड्यूल का प्रयास करें। यह वही है जो आप खोज रहे हैं।

var cookie = require('cookie'); 

cookie.parse (str, विकल्प) एक HTTP कुकी शीर्ष लेख स्ट्रिंग पार्स और सभी कुकी नाम और मान के जोड़े की एक वस्तु लौटने। स्ट्र तर्क एक कुकी हेडर वैल्यू का प्रतिनिधित्व करने वाली स्ट्रिंग है और विकल्प एक वैकल्पिक ऑब्जेक्ट है जिसमें अतिरिक्त पार्सिंग विकल्प हैं।

var cookies = cookie.parse('foo=bar; equation=E%3Dmc%5E2'); 
// { foo: 'bar', equation: 'E=mc^2' } 

आशा इस

2

में मदद करता है Regexp

//Get property directly without parsing 
function getCookie(cookie, name){ 
    cookie = ";"+cookie; 
    cookie = cookie.split("; ").join(";"); 
    cookie = cookie.split(" =").join("="); 
    cookie = cookie.split(";"+name+"="); 
    if(cookie.length<2){ 
     return null; 
    } 
    else{ 
     return decodeURIComponent(cookie[1].split(";")[0]); 
    } 
} 
//getCookie('foo=bar; equation=E%3Dmc%5E2', 'equation'); 
//Return : "E=mc^2" 

बिना या

//Convert cookie string to object 
function parseCookie(cookie){ 
    cookie = cookie.split("; ").join(";"); 
    cookie = cookie.split(" =").join("="); 
    cookie = cookie.split(";"); 

    var object = {}; 
    for(var i=0; i<cookie.length; i++){ 
     cookie[i] = cookie[i].split('='); 
     object[cookie[i][0]] = decodeURIComponent(cookie[i][1]); 
    } 
    return object; 
} 

//parseCookie('tagname = test;secure'); 
//Return : {tagname: " test", secure: "undefined"} 
1

आपत्ति उठाने कुकी अगर आप पार्स करने के लिए चाहता हूँ आईओ कुकी डिफ़ॉल्ट कुकी socket.io है उपयोगकर्ता आईडी के रूप में उपयोग करता है। आप इसे सेट कर सकते हैं लेकिन यदि आप नहीं करते हैं तो यह एक बना देगा और इसमें हैश वैल्यू सेट होगा। Read about the option here.

मुझे नहीं लगता कि यह एक कोड मुद्दा है। यहां आपके कोड का एक उदाहरण दिया गया है। जब मैं कुकी परीक्षण जोड़ा गया है और 1

var app = require('express')(); 
var http = require('http').Server(app); 
var cookie = require('cookie') 
var io = require('socket.io')(http); 
var port = process.env.PORT || 3000; 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/index.html'); 
}); 

io.sockets.on('connection', function(socket) { 
    socket.on('chat message', function(){ 
     var a = socket.request.headers.cookie; 
     var b = cookie.parse(a); //does not translate 
     console.log(b); 
    }); 
}); 

http.listen(port, function(){ 
    console.log('listening on *:' + port); 
}); 

सर्वर आउटपुट

{ io: 'TxvLfvIupubZpOaGAAAF', test: '1' } 

के लिए सेट यदि मैं यह करने के लिए इसे बदल दिया है।

var io = require('socket.io')(http, { 
    cookie : 'id' 
}); 

आउटपुट इसे बदल देगा।

{ id: 'ZJPSwFsQAje0SrgsAAAD', test: '1' }