express.js не сохраняет данные сеанса в тестах узла узла

Обновление внизу!

Мой сервер node.js использует express.js для управления сессиями. После входа я сохраняю некоторую информацию о пользователе в req.session. У меня есть конечная точка выхода из системы, которая просто удаляет пользовательские данные из req.session перед отправкой ответа.

С каждым запросом, который делает пользователь, я использую промежуточное программное обеспечение для аутентификации, чтобы убедиться, что в сеансе все еще есть пользовательские данные, поэтому удаление пользовательских данных в объекте сеанса должно завершиться неудачей любой последующей аутентификации.

Чтобы проверить мой сервер, у меня есть тест узла узла, который входит в систему, вызывает несколько конечных точек, выходит из системы, а затем пытается вызвать другую конечную точку. Я ожидал бы, что последняя конечная точка потерпит неудачу в аутентификации, потому что я ранее уничтожил пользовательские данные. Вместо этого, когда я делаю последний звонок, мои пользовательские данные все еще там. Это как если бы вызов выхода из системы, который удалил его, не был записан обратно в хранилище сеансов.

Вот мой app.js:

app.use(express.cookieParser('secretPassword'));
app.use(express.cookieSession({key: 'someKey'}));
...
app.get('/logout', accounts.logout);
app.get('/account', auth.authenticateSession, accounts.show);

auth.js:

exports.authenticateSession = function(req, res, next) {
    if (!req.session.user) {
        return res.json(401, {
            error: 'Access denied. You must be logged in to make this request.'
        });
    }
    ...
}

accounts.js: выход из системы:

exports.logout = function(req, res) {
    req.session.user = null;
    res.send('Logged out');
};

Модульные тесты:

step1_logIn : function(test) {
    var postData = qs.stringify({
        accountname: 'testAcct',
        accountpassword: 'hello'
    });
    ct.postAndCall('/login', null, postData, function(resData, res) {
        myCookie = res.headers['set-cookie'];
        test.ok(res.statusCode === 200);
        test.done();
    });
},

step2_logout : function(test) {
    ct.getAndCall('/logout', myCookie, function(data, res) {
        test.ok(data === 'Logged out.');
        test.ok(res.statusCode === 200);
        test.done();
    });
},

step3_ensureLoggedOut: function(test) {
    ct.getAndCall('/account', myCookie, function(data, res) {
        test.ok(res.statusCode === 401);
        test.done();
    });
}

Когда тесты запускаются, выполнение успешно завершается, затем в authenticateSession по вызову /account и на данный момент, req.session.user все еще существует! Зачем!?

  • Мой магазин печенья дает мне устаревшие данные?
  • Есть ли способ заставить express сохранить данные моего сеанса вручную, или я просто изменяю объект req.session и верим, что он собирается его сохранить?

Обновить:

Похоже, что эта проблема напрямую связана с промежуточным программным обеспечением приложения, окружающим куки. Когда я использую app.use(express.session()) вместо app.use(express.cookieSession(...)), данные сеанса должным образом сдуваются, и мои тесты проходят.

1 ответ

Я понял. По-видимому express.cookieSession(...) предназначен для хранения с однократным набором. Последующие запросы будут иметь доступ к данным сеанса, которые были изначально установлены, но изменение объекта req.session не сохранит новые данные сеанса.

Чтобы исправить проблему, я переключился на использование express.session(...) который использует серверное хранилище для сеансовых переменных.

Другие вопросы по тегам