Jedna sesja na wielu stronach socket.io

0

Czesc, bawie sie z socket.io i chcialem sobie napisac prosta rzecz, a mianowicie na stronie glownej "/" pobieram nazwe uzytkownika, wysylam do socketu, socket odbiera i wysyla znow do frontu, ale tym razem w "/chat", i wysylajac wiadomosci mam uzytkownika pobranego z "/" oraz wiadomosci z "/chat", ale problem jest taki, ze jak zmieniam urla z "/", na "/chat", to niestety ale tworzy sie nowy connect, bo sprawdzam to w konsoli basha. Wiec zawsze jak zmienie urla to robi sie disconnect, a pozniej connect, wiec pewnie dlatego on nie widzi tego pobrania, nie wiem. Czy moglby mi ktos pomoc jak zrobic sesje io na wielu stronach?

Kod serwera wyglada tak:

 

var express = require('express');
var routes = require('./routes');
var http = require('http');

var app = express(), 
    server = http.createServer(app) ,
    io = require('socket.io').listen(server);


app.set('view engine', 'jade');
//app.set('view engine', 'html');
app.use('/public', express.static(__dirname + '/public'));



app.get('/', routes.home);
app.get('/chat', routes.chat);


io.on('connection', function(socket){
//console connection
  console.log('user connect');
//socket on message
  socket.on('get message', function(msg){
    io.emit('send message', msg);
  });
//console disconnect
  socket.on('disconnect', function(msg){
    console.log('user disconnected');
  });
//get user
  socket.on('user', function(user){
    io.emit('user', user)
  })

});
server.listen(3000,function(){
	console.log("Server start at port: 3000");
});


A frontu tak

 
 
 var socket = io();
 // get name from home.jade
$('#bname').on('click', function(){
 	socket.emit('user', $('#name').val());
 });


  $('form').submit(function(){
    socket.emit('get message', $('#m').val());

   socket.on('user', function(user){
    $('#messages').append($('<li>').text(user));
  });

    $('#m').val('');
    console.log(user);
    return false;
  });
  socket.on('send message', function(msg){
    $('#messages').append($('<li>').text(msg));
  });

Wiadomosci w "/chat" przychodza wiadomo, ale uzytkownik sie nie pokazuje, bo tak jak juz mowilem, konsola pokazuje ze co zmiane urla socket laduje sie na nowo.
W "/" mam zwyklego a hrefa, ktory ma sciezke do "/chat".

0

Już mi się powoli myślenie wyłącza, więc wybacz jak napiszę coś co nie będzie pasowało do Twojej koncepcji :)

Otóż, użytkownik wchodzi na stronę, pokazujesz mu pole gdzie wpisuje pseudonim i potem jest przekierowanie do czatu (inny url). Tak to rozumiem.

Na pierwszej stronie zapisujesz sobie login w localStorage i w czacie go odczytujesz, potem przesyłasz socketem do backendu. Jeżeli potrzebujesz na pierwszej stronie jakiejś autoryzacji to polecam JWT Token (widzę, że w Node masz express'a więc jest middleware, który zrobi za Ciebie całą robotę - szukaj socket-jwt albo jwt-socket).

Druga opcja to wykorzystujesz React lub coś podobnego i bez przeładowania strony uzyskujesz taki sam efekt, więc problem znika :-)

0

Druga opcja to wykorzystujesz React lub coś podobnego i bez przeładowania strony uzyskujesz taki sam efekt, więc problem znika
Taka koncepcje mialem od samego poczatku, chcialem to zrobic w angularze, ale to bez roznicy w czym, tylko po prostu myslalem ze jest to niepoprawne rozwiazanie tego problemu. Dzieki za pomysl, dzisiaj juz tego nie ogarne bo moj mozg tak, samo jak Twoj juz oslabiony o tej porze, ale w niedalekim czasie jak najbardziej ;)

0

A jednak ciekawosc byla wieksza :P Zrobilem to w taki sposob jak mowiles. Pobieram localstorage z pierwszej strony, a pozniej z drugiej strony wpycham go do tablicy, po czym usuwam localstorage. A pozniej emituje z frontu do socketa tablice[0], czyli z elementem ktory juz jest. Jest to dobre rozwiazanie? Zalezami na tym zeby local storage po prostu zniknal.

0

Tak, jest ok. Nie wiem jak wygląda Twój kod, ale nick możesz zapisać w zmiennej tablica do zapisania pojedynczego stringa nie jest optymalnym rozwiązaniem.

0

To znaczy po stronie serwera mam tablice clients[] i jesli uzytkownik wejdzie na strone, czyli jest connect, to wrzucam go do tablicy z tego local storage, po czym usuwam local storage, emituje kazdego uzytkownika po stronie frontu, odbieram w sockecie, wrzucam do tej tablicy clients i znow emituje, po stronie serwera, no i leci pozniej do frontu, zeby bylo mozna wyswietlic tablice clients.

1 użytkowników online, w tym zalogowanych: 0, gości: 1