Разбор cookie с socket.io

Я пытаюсь правильно читать файлы cookie на моем сервере node, которые были установлены мной через консоль браузера на localhost: 3000 следующим образом:

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

В моем сервере node я использую 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);
    });
}       

Я, очевидно, хочу получить объект со всеми файлами cookie, которые были отправлены каждым io.connect в браузере. Я пытался решить это в течение 5 часов, и я действительно не знаю, что я делаю неправильно здесь.

Ответ 1

Используйте модуль Cookie. Это именно то, что вы ищете.

var cookie = require('cookie');

cookie.parse(str, опции) Разбирайте строку заголовка HTTP Cookie и возвращаете объект всех пар имя-значение cookie. Аргумент str - это строка, представляющая значение заголовка Cookie, а опции - необязательный объект, содержащий дополнительные параметры синтаксического анализа.

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

Ответ 3

Попробуйте использовать socket.handshake вместо socket.request

Ответ 4

Файл cookie IO является файлом cookie socket по умолчанию, который используется как идентификатор пользователя. Вы можете установить это, но если вы этого не сделаете, он будет создавать один и установить для него значение хэша. Читайте об этом параметре.

Я не думаю, что это проблема с кодом. Вот пример вашего кода. Когда я добавил тест 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' }