Nodejs express+connect+mongodb,使用session,怎么监听session的生成和销毁事件?
Nodejs express+connect+mongodb,使用session,怎么监听session的生成和销毁事件?
express+connect+mongodb,使用session,怎么监听session的生成和销毁事件?做个项目,要求能显示在线用户列表以及用户session中的部分内容,前端是特殊设备(机顶盒),浏览器不支持HTML5,只能在后端NODE.JS中操作,由于前段设备特殊,所以经常会出现直接关机的情况,在线列表不好制作啊!
Node.js Express + Connect + MongoDB 中监听 Session 的生成和销毁事件
在 Node.js 应用程序中使用 express
、connect-mongo
和 connect-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');
});
解释
-
Session 配置:
- 使用
express-session
和connect-mongo
来配置 Session 存储到 MongoDB。 secret
是用于签名 session cookie 的密钥。store
指定了将 session 数据存储到 MongoDB 中。
- 使用
-
监听 Session 创建和销毁事件:
req.session.on('create', ...)
会在一个新的 session 被创建时触发。req.session.on('destroy', ...)
会在 session 被销毁时触发。- 在这些事件处理器中,你可以记录日志或者执行其他业务逻辑。
-
示例路由:
/
路由会检查是否有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文档,寻找更合适的解决方案。