我有一个使用Redis来存储会话状态的api。这适用于需要身份验证的api路由。
但是,我有一些不需要身份验证的路由。当命中这些路由时,在Redis中创建一个新的会话密钥(除非用户已经过身份验证),但该值不包含任何有用的信息。我想防止在Redis中创建这些无用的条目。
我遇到的麻烦是在执行路由处理程序之前创建会话。因此,在创建会话时,我不知道路由是否需要身份验证。
var sessionware = express.session({ ... session options ...});
app.use(function session(req, res, next) {
// if i knew i didn't need to save the session inside here, i could avoid doing so
// but I have no good way of knowing that.
sessionware(req, res, next);
});
我错过了什么吗?这似乎是一种相当常见的情况,但我无法在任何地方找到它。
答案 0 :(得分:1)
至少有几种方法可以解决这个问题:
您可以根据请求的属性编写仅执行会话中间件的中间件(例如,基于标头值,Cookie,请求URL /路径等)。
上面的一个变体,你有一个自定义中间件函数,它首先检查会话cookie,如果它存在,它会在redis中查找该会话密钥。如果存在,请调用会话中间件。
将会话中间件用于各个路由。例如:app.post('/foo', session, function(req, res) {})
。
首先包含未经身份验证的路由,然后再使用会话中间件和经过身份验证的路由,将其分开。