Nodejs express+connect+mongodb,使用session,怎么监听session的生成和销毁事件?

发布于 1周前 作者 wuwangju 来自 nodejs/Nestjs

Nodejs express+connect+mongodb,使用session,怎么监听session的生成和销毁事件?

express+connect+mongodb,使用session,怎么监听session的生成和销毁事件?做个项目,要求能显示在线用户列表以及用户session中的部分内容,前端是特殊设备(机顶盒),浏览器不支持HTML5,只能在后端NODE.JS中操作,由于前段设备特殊,所以经常会出现直接关机的情况,在线列表不好制作啊!

4 回复

Node.js Express + Connect + MongoDB 中监听 Session 的生成和销毁事件

在 Node.js 应用程序中使用 expressconnect-mongoconnect-session 来管理 Session,并且需要监听 Session 的生成和销毁事件时,可以通过中间件和事件监听器来实现。

示例代码

首先,确保你已经安装了所需的依赖包:

npm install express connect-mongo connect-session mongodb

然后,你可以设置一个简单的 Express 应用来监听 Session 的生成和销毁事件。以下是一个基本的示例:

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const app = express();

// 配置 session
app.use(session({
  secret: 'your_secret_key',
  resave: false,
  saveUninitialized: true,
  store: new MongoStore({ 
    url: 'mongodb://localhost:27017/session_db' 
  }),
  cookie: { maxAge: 60000 } // 设置 Session 过期时间
}));

// 监听 Session 创建事件
app.use((req, res, next) => {
  req.session.on('create', (session) => {
    console.log(`Session created for user ${session.user_id}`);
  });
  next();
});

// 监听 Session 销毁事件
app.use((req, res, next) => {
  req.session.on('destroy', (session) => {
    console.log(`Session destroyed for user ${session.user_id}`);
  });
  next();
});

// 示例路由
app.get('/', (req, res) => {
  if (!req.session.user_id) {
    req.session.user_id = Math.random().toString(36).substring(2); // 生成随机的 user_id
  }
  res.send(`Hello, your user ID is ${req.session.user_id}`);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

解释

  1. Session 配置:

    • 使用 express-sessionconnect-mongo 来配置 Session 存储到 MongoDB。
    • secret 是用于签名 session cookie 的密钥。
    • store 指定了将 session 数据存储到 MongoDB 中。
  2. 监听 Session 创建和销毁事件:

    • req.session.on('create', ...) 会在一个新的 session 被创建时触发。
    • req.session.on('destroy', ...) 会在 session 被销毁时触发。
    • 在这些事件处理器中,你可以记录日志或者执行其他业务逻辑。
  3. 示例路由:

    • / 路由会检查是否有 user_id,如果没有则创建一个新的 user_id 并存储在 session 中。

通过这种方式,你可以在后端监听 session 的生成和销毁事件,从而更好地管理和监控用户状态。


直接弄个长连接, 断开了就是离线了…

session一般是过期自动销毁,把过期时间设短一点,前端每隔一段时间发一个请求更新session的过期时间。 在线用户列表就是每隔一段时间查询session表不就行了。

为了监听session的生成和销毁事件,你可以使用express-session中间件结合自定义的session存储。在这个例子中,我们将使用connect-mongodb作为session存储,并在session创建和销毁时添加监听器。

首先确保安装了必要的包:

npm install express express-session connect-mongodb

然后,你可以设置一个基本的Express应用,配置session并添加监听器:

const express = require('express');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);

const app = express();

// 创建MongoDB存储实例
const store = new MongoDBStore({
    uri: 'mongodb://localhost:27017/test',
    collection: 'mySessions'
});

store.on('error', function(error) {
    console.log('Session storage error:', error);
});

// 添加会话中间件
app.use(session({
    secret: 'your_secret_key',
    cookie: { maxAge: 60000 },
    store: store,
    resave: false,
    saveUninitialized: false
}));

// 监听session创建事件
app.use((req, res, next) => {
    req.session.on('create', (session) => {
        console.log('Session created:', session.id);
    });

    // 监听session销毁事件
    req.session.on('destroy', () => {
        console.log('Session destroyed:', req.sessionID);
    });

    next();
});

// 路由示例
app.get('/', (req, res) => {
    if (!req.session.views) {
        req.session.views = 1;
    } else {
        req.session.views++;
    }
    res.send(`Views: ${req.session.views}`);
});

app.listen(3000, () => {
    console.log('App listening on port 3000!');
});

注意,express-session本身并不直接提供session的创建和销毁事件。因此,上述代码实际上使用了req.session对象上的事件监听机制,这可能并不是最理想的方法。对于更复杂的会话管理需求,你可能需要深入研究connect-mongodb或其他会话存储库的API文档,寻找更合适的解决方案。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!