node.js - express.js 未在 NodeUnit 测试中保存 session 数据

标签 node.js session cookies express nodeunit

在底部更新!

我的node.js服务器使用express.js来管理 session 。登录后,我将一些用户信息存储在 req.session 中。我有一个注销端点,它只是在发送响应之前从 req.session 中删除用户数据。

对于用户发出的每个请求,我都会使用身份验证中间件来确保 session 中仍然存在用户数据,因此删除 session 对象中的用户数据应该会使任何后续身份验证失败。

为了测试我的服务器,我有一个 Node 单元测试,它可以登录、调用一些端点、注销,然后尝试调用另一个端点。 我希望最后一个端点在身份验证中失败,因为我之前丢失了用户数据。相反,当我最后一次调用电话时,我的用户数据仍然存在。就好像删除它的注销调用没有写回到 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仍然存在!为什么!?

  • 我的 Cookie 存储是否向我提供过时的数据?
  • 有没有办法强制 Express 手动保存我的 session 数据,或者我只是修改 req.session 对象并相信它会保存它?

更新:

看起来这个问题与围绕cookie的应用程序中间件直接相关。当我使用app.use(express.session())时而不是app.use(express.cookieSession(...)) , session 数据被正确地清除并且我的测试通过了。

最佳答案

我明白了。显然 express.cookieSession(...) 是一种一次性设置的存储类型。后续请求将可以访问最初设置的 session 数据,但更改 req.session 对象不会保存回新的 session 数据。

为了解决这个问题,我改用 express.session(...),它使用服务器端存储来存储 session 变量。

关于node.js - express.js 未在 NodeUnit 测试中保存 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19189791/

相关文章:

javascript - 连接已创建但未找到

google-app-engine - Google 应用引擎用户 Auth : Djangoappengine Vs Web2py Vs Webpy

php - 从 session 用户名中选择

php - 从 php 表单获取 cookie 值

C# web 服务器看不到存储的 cookie

javascript - 在 Javascript 和服务器中读取第三方 Cookie

javascript - 在对 npm 包进行 require 时,包名中的斜杠是什么意思?

javascript - 通过 socket.io 添加 ssl 后无法发出消息

javascript - 错误处理的函数式方法

session - 我希望我的 Domino Servlet 获得经过身份验证的用户 session