只保存特定请求的用户会话

Only save user session on certain requests

我正在使用 connect-mongo and express-session 来跟踪用户的会话。我有以下代码来设置会话:

app.use(session({
    secret: 'scamp',
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl: 60 * 30 // half hour
    })
}));

这个问题是为每个发送到服务器的请求创建一个会话。例如,我使用 Amazon Web Services 来托管我的应用程序,并且每 10 秒向我的服务器发送一个请求以确保它仍然正常运行(称为运行状况检查)。健康检查请求是对 mydomain/health 的 GET 请求。但是使用我拥有的代码,这将创建一个新会话,该会话存储在我的远程 Mongo Db 的会话集合中。所以数据库增长得非常快。

一些背景:我的应用程序允许用户上传文件,然后与每个文件进行交互。我只希望会话跟踪用户正在与之交互的当前文件(在我的会话中,我保留当前文件 ID、文件路径、选择的当前文件参数等)。所以基本上,我只想将某些请求的会话设置到我的 API,而不是全部。

所以我想我会重写我的代码:

var setsession = function (req, res, next){

    session({
        secret: 'scamp',
        store: new MongoStore({
            mongooseConnection: mongoose.connection,
            ttl: 60 * 30 // half hour
        })
    })

    next();
};

app.use(setsession);

然后我计划在 setSession() 内进行检查以查看请求端点是什么,如果请求是我想要会话的其中之一,则设置会话。但是,在更改上面的代码后,这会立即破坏我的应用程序。下面我有:

app.get('/api/canvas', function(req, res) {

    sess = req.session;

    var callback = function() {

        graphController.constructGraph();
    };

    console.log('req.session is ', req.session);

    var graphController = new GraphController(req, res, sess, callback);
});

现在,在将 session() 移出 app.use 并进入其自己的方法后,req.session 变为 undefined,我的应用程序中断了。知道为什么会这样吗?

此外,这是停止在对 API 的每个请求上存储会话的好方法吗?

有一个 saveUninitialized 选项可以防止会话在不包含任何数据时被保存。

app.use(session({
    secret: 'scamp',
    store: new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl: 60 * 30 // half hour
    }),
    saveUninitialized: false
}));

Forces a session that is "uninitialized" to be saved to the store. A session is uninitialized when it is new but not modified. Choosing false is useful for implementing login sessions, reducing server storage usage, or complying with laws that require permission before setting a cookie. Choosing false will also help with race conditions where a client makes multiple parallel requests without a session.

The default value is true, but using the default has been deprecated, as the default will change in the future. Please research into this setting and choose what is appropriate to your use-case.

https://www.npmjs.com/package/express-session#saveuninitialized