首页 > 解决方案 > NodeJS - 如何禁用特定路由的会话

问题描述

我想禁用特定路由的会话创建,如“/app/....”;

我使用下面的代码尝试了一种方法:

pool = mysql.createPool(mysqlOptions);
var sessionConnection = mysql.createConnection(mysqlOptions);
var sessionStore = new MySQLStore(mysqlOptions, sessionConnection);
app.use(function(req, res, next){
  if (!req.path.startsWith("/app/")) 
    session({
      key: 'x',
      secret: 'x',
      store: sessionStore,
      resave: false,
      saveUninitialized: true,
      cookie: {maxAge: moment().endOf('days').diff(moment())} })(req, res, next);
  else
    next();
});

我看到下面的警告消息,几分钟后,服务器无法访问。

MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。11 个断开连接的侦听器添加到 [MySQLStore]。使用emitter.setMaxListeners() 增加限制

有人可以解释一下吗?提前致谢。

标签: node.jssessiondisable

解决方案


如果您将路由声明放在会话中间件之前,则不会为该特定路由处理程序创建会话。

app.use("/app", appRouter);   // this will be handled before session is created
app.use(session(...));

如果您想以您在代码中的方式动态调用会话,那么您应该创建一次会话中间件,然后动态调用它:

pool = mysql.createPool(mysqlOptions);
const sessionConnection = mysql.createConnection(mysqlOptions);
const sessionStore = new MySQLStore(mysqlOptions, sessionConnection);
const sessionMiddleware = session({
      key: 'x',
      secret: 'x',
      store: sessionStore,
      resave: false,
      saveUninitialized: true,
      cookie: {maxAge: moment().endOf('days').diff(moment())} 
});

app.use(function(req, res, next){
  if (!req.path.startsWith("/app/")) 
      sessionMiddleware(req, res, next);
  else
    next();
});

推荐阅读