2016-09-01 60 views
12

解析饼干我想正确地读取由我通过在本地主机上的浏览器控制台设置我的节点服务器上的cookie:3000这样的:与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发送的所有cookie。 我一直试图解决它5个小时,我真的不知道我在这里做错了什么。

+0

客户端是什么?我没有定义任何被称为“客户端”的东西。当我粘贴该行时,我得到“客户端未定义” – user1938653

+0

对不起,请忽略 –

+0

@ user1938653您也可以在URL中将对象从客户端发送到服务器(io.connect('localhost:3000?{key:value}')),在后端,您可以从套接字中间件的URL中获取对象。 – KlwntSingh

回答

1

尝试使用socket.handshake代替socket.request

+0

刚刚做过,我看到相同格式的东西,意思是相同的。 – user1938653

7

使用Cookie模块。这正是你正在寻找的。

var cookie = require('cookie'); 

cookie.parse(STR,选项) 解析的HTTP Cookie头部字符串并返回所有cookie的名称 - 值对的对象。 str参数是表示Cookie标头值的字符串,options是包含附加解析选项的可选对象。

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

希望这有助于

2

没有正则表达式

//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" 

或者,如果你想解析cookie来反对

//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

的IO Cookie是默认的Cookie socket.io用作用户ID。你可以设置它,但如果你不这样做,它会创建一个并为其设置一个散列值。 Read about the option here.

我不认为这是一个代码问题。这里是你的代码的一个例子。当我加入了cookie的测试,并将其设置为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' }