Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从express和connect中间件开始控制会话_Node.js_Session_Express_Connect - Fatal编程技术网

Node.js 从express和connect中间件开始控制会话

Node.js 从express和connect中间件开始控制会话,node.js,session,express,connect,Node.js,Session,Express,Connect,有没有一种方法可以通过connect的会话中间件控制会话何时启动 例如,如果我有express app config: var app = express(); app.configure(function(){ app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('secret')); app.use(express.session({ st

有没有一种方法可以通过connect的会话中间件控制会话何时启动

例如,如果我有express app config:

var app = express();
app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('secret'));
  app.use(express.session({ store:sessionStore, ... }));
});
然后在每个请求上,如果没有给出会话cookie,则启动会话。如果我只想在用户经过身份验证后启动会话,该怎么办

例如,假设我有两条路由
/protected
/login

  • 如果有人在没有会话cookie的情况下点击
    /protected
    ,中间件将不会启动新会话。(
    req.session
    null
  • 如果有人使用会话cookie点击
    /protected
    ,中间件将检查是否有与cookie匹配的活动会话,并设置
    请求会话
    ,但不会启动新会话。(
    req.session
    可以有值,也可以是
    null
  • 如果有人使用正确的参数点击了
    /login
    ,则会显式启动会话,然后才设置cookie
启动会话的唯一方法应明确:

app.post('/login', function(req, res, next) {
  // connect to database and validate user...
  db.authenticate( req.body.user, req.body.pass, function(allow) {
    if (allow) {
      // START SESSION HERE
      // this will send set the cookie
    }
  });
}

使用现有的连接会话中间件有什么方法可以实现这一点吗?

即使每次都启动一个会话,也不重要,因为它将是空的。如果您试图使用它来验证访问权限(似乎就是这种情况),最简单的解决方案是在会话中设置一个属性(例如req.session.authenticated=true;),并进行检查。从技术上讲,任何访问者都有一个会话,但是只有当req.session.authenticated==true时,您才会使用该会话。这可能不是您想要的,但这是完成此操作的最简单方法。

您要做的是删除此行:

app.use(express.session({ store:sessionStore, ... }))
现在会话在默认情况下被禁用,由您决定使用哪个控制器:

var useSessions = express.session({ store:sessionStore, ... });

var preCb = function (req, res, next) {
  // authenticate and stuff
  // ....
  if (authenticated === true) {
     next();
  }
};

app.post('/login', useSessions, function(req, res, next) { ... });
app.post('/protected', preCb, useSessions, function(req, res, next) { ... });

如果您使用的是后台数据库会话存储,那么每个匿名用户都将创建存储在数据库中的会话。我确实理解这一点,但无论如何,您不应该永远保留会话数据。当会话数据过期时,应该将其删除,如果匿名用户只访问您站点上的几个页面,则应该在他们离开后很快将其删除。此外,匿名用户的会话本质上是空对象(如果我错了,请纠正我),因此不应该是一个巨大的内存负担。会话中间件的工作方式是,它将为每个没有会话的用户创建一个会话(没有cookie)。这意味着对于每个不发送cookie的请求,数据库都会有一个条目。在我正在使用的系统中,这是不可接受的。如果您将会话信息存储在数据库中,而没有清除过期信息,我可以看出这将是一个问题。您可以尝试(我不确定这是否可行)创建自己的中间件,用于检查会话cookie。如果存在,则使用app.use(express.session(..),否则只需调用next()。我不确定这是否有效,但这只是一个想法。在这里看一下创建中间件:是的,我想我将实现自己的中间件来处理它。在我看来,这似乎是一个缺乏的特点。