Синхронизация экспресс-сеанса с Socket.IO

#javascript #node.js #express #socket.io #express-session

Вопрос:

Я столкнулся с проблемой, когда мне нужно связаться со своим Node.js сервер, а также с моим сокетом.Экземпляр ввода-вывода. Эта часть работает, но мне также нужно получить доступ к сеансам, которые я создал с помощью Express, даже внутри сокета.Слушатели ИО. Для достижения этой цели я использую сеанс express-socket.io. Технически это работает, но не так, как я хочу. Когда я вношу изменения в сеанс, я использую req.session.save(function(err) {}) их для того, чтобы убедиться, что он действительно сохранен. Я использую socket.handshake.session.save(function(err) {}) внутри розетки.Слушатели IO также. Сеансы сохраняются, но я заметил, что в то время как сеанс может быть доступен по назначению вне слушателей, используя их внутри любого моего гнезда.ИО слушателей не так… просто. Они несинхронизированы. Например, если я запущу req.session.user = "abc" , он будет отображаться как undefined в сокете.Слушатель ввода-вывода… если я не обновлю страницу. Благодаря этому открытию и нескольким ответам здесь я понял, что отсоединение и подключение розетки.Ввод-вывод со стороны клиента исправляет это. Но я не уверен, что это было бы лучшим решением проблемы. Несмотря на то, что это работает, есть сценарии, в которых я не могу просто отключаться и подключаться снова и снова. За другой… сеанс поиска решений я попробовал использовать socket.handshake.session.reload(function(err) {}) , прежде чем делать что-либо еще. Как ни странно, я думаю, что иногда это действительно работает. Но даже если это правда, сеанс остается с этим undefined значением большую часть времени. Я использую следующую конфигурацию:

 var session = require("express-session")({
    // ...
    resave: false,
    saveUninitialized: false
});
 

Я попытался использовать saveUninitialized: true вместо этого, и мне показалось, что он синхронизирует сеансы, но он не реагировал на сценарии, в которых пользователь удалял свои файлы cookie вручную, через браузер. В таком случае сеанс действительно должен выглядеть так undefined . И это так… только не внутри слушателей. В документации также говорится, что использование true устарело.

Я застрял с этой проблемой, и, несмотря на все усилия, чтобы найти решение, я не смог. Есть ли другие методы, которые я могу попробовать?