Этот код не полный, но я думаю этого хватит. Я хочу получить имя пользователя из 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. Здесь мне вообще ничего не понятно(