Разбор 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' }