Nodejs 关于connect的2个session中间件
Nodejs 关于connect的2个session中间件
express-session 和 connect-session
读了README后还是感觉迷迷糊糊的。写了段代码想看看究竟发生了什么。
var express = require('express')
, cookieParser = require('cookie-parser')
, session = require('cookie-session')
, express_sess = require('express-session')
, app = express();
app.use(cookieParser())
//app.use(session({ keys: [‘abc’], name: ‘user’ }));
app.use(express_sess({ secret: ‘abc’, key: ‘user’}));
app.get(’/’, function (req, res, next) {
res.end(JSON.stringify(req.cookies));
console.log(req.session)
console.log(req.cookies)
});
app.listen(3000);
看完输出结果依旧很困惑。对于connect-session
,输出都是空对象。对于express-session
,输出为
req.session: { cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}
req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
怎么解释这2个中间件的表现,又或者什么时候该用它们?
Node.js 中关于 connect
的两个 Session 中间件
概述
在这篇帖子中,我们将探讨两个常见的用于处理 Session 的中间件:express-session
和 connect-session
。我们将通过代码示例来解释这两个中间件的工作方式,并讨论它们之间的差异以及使用场景。
示例代码
首先,我们创建一个简单的 Express 应用来演示这两个中间件的行为。
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('connect-session');
var express_sess = require('express-session');
var app = express();
// 使用 cookie-parser 中间件解析请求中的 Cookie
app.use(cookieParser());
// 使用 connect-session 中间件
// app.use(session({ secret: 'abc' }));
// 使用 express-session 中间件
app.use(express_sess({ secret: 'abc', key: 'user'}));
app.get('/', function (req, res, next) {
// 输出 Cookie
res.end(JSON.stringify(req.cookies));
// 输出 Session 和 Cookie
console.log('req.session:', req.session);
console.log('req.cookies:', req.cookies);
});
app.listen(3000);
解释
-
CookieParser
- 我们首先使用
cookie-parser
中间件来解析请求中的 Cookie。这是必要的,因为express-session
和connect-session
都依赖于 Cookie 来存储会话标识符。
- 我们首先使用
-
Express-Session
- 在这段代码中,我们注释掉了
connect-session
中间件的使用,并启用了express-session
中间件。 express-session
是一个广泛使用的中间件,它提供了一个简单的方式来管理用户会话。它使用 Cookie 来存储会话 ID,并将实际的会话数据存储在服务器端(默认情况下,存储在内存中)。- 当访问根路径
/
时,req.session
会被初始化并包含一个名为cookie
的属性,其中包含了与 Cookie 相关的信息。而req.cookies
包含了客户端发送的所有 Cookie,包括由express-session
创建的user
Cookie。
- 在这段代码中,我们注释掉了
-
Connect-Session
connect-session
是一个较老的中间件,它与connect
框架一起使用。由于现代的 Web 开发通常使用 Express(基于 Connect),所以connect-session
已经不是首选的会话管理工具。- 如果启用
connect-session
中间件,你会看到req.session
是一个空对象,这是因为connect-session
并没有正确地设置或获取会话数据。
使用场景
- Express-Session: 适用于大多数现代 Node.js 应用,特别是那些需要管理用户会话的应用。它提供了丰富的功能和良好的社区支持。
- Connect-Session: 由于其较旧且不再被广泛维护,建议避免使用。如果你正在维护一个古老的项目,可能需要继续使用它,但在新项目中应选择
express-session
。
通过以上示例和解释,希望你能更好地理解 express-session
和 connect-session
的工作原理及其适用场景。
Node.js 关于 connect
的两个 session 中间件
背景
express-session
和 connect-session
都是用于处理 HTTP Session 的中间件。然而,它们在实现和使用方式上有所不同。
代码分析
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('cookie-session');
var express_sess = require('express-session');
var app = express();
app.use(cookieParser());
// 使用 connect-session
// app.use(session({ keys: ['abc'], name: 'user' }));
// 使用 express-session
app.use(express_sess({ secret: 'abc', key: 'user'}));
app.get('/', function (req, res, next) {
res.end(JSON.stringify(req.cookies));
console.log(req.session);
console.log(req.cookies);
});
app.listen(3000);
结果分析
-
express-session
:req.session
输出一个包含cookie
属性的对象。req.cookies
输出一个包含用户会话标识符的 cookie 对象。
这是因为
express-session
会在客户端存储一个 session ID,并且这个 session ID 会被存储在 cookie 中。每次请求时,Express 会根据这个 session ID 从服务器端的存储(如内存、数据库)中检索对应的 session 数据。 -
connect-session
:- 输出空对象。
这是因为
connect-session
是一个较低级别的中间件,它本身不提供任何默认的 session 存储机制。你需要指定一个存储适配器(例如 MongoDB、Redis 等)来实际保存 session 数据。如果你没有配置适配器,那么connect-session
将不会保存或检索 session 数据。
使用场景
-
express-session
: 当你需要一个易于使用的 session 管理中间件时,express-session
是一个很好的选择。它提供了默认的内存存储,适合开发环境和小型应用。 -
connect-session
: 如果你需要更灵活地管理 session 存储(例如,需要使用 Redis 或 MongoDB),并且希望对底层存储有更多的控制,可以考虑使用connect-session
。但你需要自己实现适配器来处理存储和检索 session 数据。
示例代码
使用 express-session
的完整示例:
var express = require('express');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var app = express();
app.use(cookieParser());
app.use(session({
secret: 'abc',
key: 'user',
resave: false,
saveUninitialized: true
}));
app.get('/', function (req, res, next) {
req.session.name = 'John Doe';
res.end(JSON.stringify(req.cookies));
console.log(req.session);
console.log(req.cookies);
});
app.listen(3000);
通过这个示例,你可以看到如何设置 express-session
并保存一些会话数据。