@pavuuuk

Как передать username на сторону клиента с помощью socket.io?

Этот код не полный, но я думаю этого хватит. Я хочу получить имя пользователя из mongoDB по id сессии и отправить это имя клиенту. Вроде всё работает, но когда я выхожу и удаляю сессию, то вылетает ошибка Cannot read property 'user' of undefined, в этой вот строке: const id = session.user. То есть sid всё ещё существует после выхода и выполняется функция loadUser. Если я ставлю проверку if (session) {...} в loadUser, то всё нормально. Но мне всё-равно кажется, что я делаю что-то не так и это можно сделать как-то по другому.
app.js
let
	express	     = require('express'),
	http	             = require("http"),
        config	     = require("./config/config"),
	cookieParser = require("cookie-parser"),
	mongoose    = require("./libs/db/mongoose"),
	session         = require("express-session"),
	MongoStore = require("connect-mongo")(session),
	cookie          = require("cookie"),
	app		     = express();

let mongooseStore = new MongoStore({mongooseConnection: mongoose.connection});

app.use(session({
	secret: config.session.secret,
	key: config.session.key,
	cookie: config.session.cookie,
	store: mongooseStore
	resave: false,
	saveUninitialized: false;
}));

const server = http.createServer(app);
const io = require("socket.io")(server, {
	origins: "http://127.0.0.1:5500/*"
});

function loadUser(sid, next, socket) {
	mongooseStore.load(sid, (err, session) => {
		if (err) {
			next(err);
		}

		const id = session.user;
		User.findById(id, (err, foundUser) => {
			if (err) {
				next(err);
			}
			socket.handshake.session = session;
			socket.handshake.user = foundUser;

                        next();	
		});
	})
}

io.use(function(socket, next) {
	 
    var handshakeData = socket.request;
    handshakeData.cookies = cookie.parse(handshakeData.headers.cookie || "");
    var sidCookie = handshakeData.cookies[config.session.key];
    var sid = cookieParser.signedCookie(sidCookie, config.session.secret); // Id of session
	
	loadUser(sid, next, socket);

});


io.on("connection", (socket) => {
	
	if (socket.handshake.user) {
		var username = socket.handshake.user.username;
	}

	socket.on("Message", (text, cb) => {
		if (!username) {
			socket.emit("Error", {message: "User is not defined"});
		} else {
			let data = {text, username};
			socket.broadcast.emit("Message", data);
			cb(data);
		}
	});

});

server.listen(config.port, () => log.debug("Server is running"));


Logout.js
exports.post = function(req, res) {
    
    req.session.destroy(() => {

        res.redirect("/");

    });
}


И ещё, когда сижу на двух страницах, а потом выхожу на одной, то на другой я всё ещё считаюсь. Нашёл, как это исправить. Нужно просто на logout сгенерировать событие, а на app.js обработать его. Получить там всех клиентов let clients = io.sockets.clients() и перебрать их, проверяя client.handshake.session.id, но в client нету handshake. Здесь мне вообще ничего не понятно(
  • Вопрос задан
  • 742 просмотра
Решения вопроса 1
megafax
@megafax
web-программист
Для организации всех socket - при коннекте закидывайте его в "комнату" с его "userid". Таким образом сможете заэмитить для всех сокетов нашего пользователя нужное событие. Также по примеру того же passport - в middleware для socket - если пользователь авторизован - докиньте в socket user-а и он будет тебе доступен в следующих местах.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы