node.js - 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() 增加限制
有人可以解释一下吗?提前致谢。
解决方案
如果您将路由声明放在会话中间件之前,则不会为该特定路由处理程序创建会话。
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();
});