Node.js + Express.js (Connect) - доступ к сеансу из события «upgrade» - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь получить доступ к объекту сеанса из события 'upgrade', которое запускается сервером Node.js с использованием инфраструктуры Express.js. Я правильно настроил поддержку сеансов и могу получить к ней доступ из стандартных методов .get .post .put и .delete, например.

app.get('/', function(req, res) {
    req.session.test = 'Hello world'; // Works fine
    res.render('index');
});

Но если я подключу событие «обновить» на сервере следующим образом:

app.on('upgrade', function(req, socket) {
    var message = req.session.test; // Doesn't work
});

Я не могу получить доступ к объекту сеанса. Насколько мне известно, промежуточное программное обеспечение Connect Session только подключает сеанс для методов get / post / put / delete, но не для пользовательских событий, таких как 'upgrade'.

К вашему сведению, событие «обновление» генерируется клиентом во время рукопожатия WebSocket, я пытаюсь получить доступ к сеансу из первоначального рукопожатия WebSocket. Сеансовый cookie определенно присутствует в заголовках HTTP во время рукопожатия, например:

app.on('upgrade', function(req, socket) {
    var cookieHeader = req.headers['cookie'];
    console.log(cookieHeader);
});

... выведет cookie сеанса Connect. Возможно, есть способ создать объект сеанса вручную с помощью необработанного маркера cookie сеанса?


Обновление: Говорили с некоторыми людьми в IRC-чате node.js, очевидно, это либо очень сложно, либо невозможно. Промежуточное ПО Connect не подвергается нестандартным / необычным событиям, таким как «обновление». Они сказали поднять проблему в Github, вот она:

https://github.com/senchalabs/connect/issues/342

1 Ответ

1 голос
/ 11 августа 2011

Поскольку у вас нет доступа к объекту ответа, вы сможете найти объект сеанса, получив хранилище сеансов и вызвав get(session_id, callback) с идентификатором session_id, полученным из файла cookie. Вы также можете реально вызывать обычную функцию промежуточного программного обеспечения сеанса, если имеющийся у вас объект req связан с ответом через req.res, что будет делать для вас express.js, но если это событие raw node.js , тогда это соединение, возможно, не было установлено в этот момент. Когда вы создаете промежуточное программное обеспечение, вам нужно будет создать экземпляр хранилища сеансов вручную и сохранить ссылку на него, а затем передать его функции фабрики промежуточного программного обеспечения сеанса в объекте options.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...