Nodejs 关于connect的2个session中间件

Nodejs 关于connect的2个session中间件

express-sessionconnect-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个中间件的表现,又或者什么时候该用它们?


2 回复

Node.js 中关于 connect 的两个 Session 中间件

概述

在这篇帖子中,我们将探讨两个常见的用于处理 Session 的中间件:express-sessionconnect-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);

解释

  1. CookieParser

    • 我们首先使用 cookie-parser 中间件来解析请求中的 Cookie。这是必要的,因为 express-sessionconnect-session 都依赖于 Cookie 来存储会话标识符。
  2. Express-Session

    • 在这段代码中,我们注释掉了 connect-session 中间件的使用,并启用了 express-session 中间件。
    • express-session 是一个广泛使用的中间件,它提供了一个简单的方式来管理用户会话。它使用 Cookie 来存储会话 ID,并将实际的会话数据存储在服务器端(默认情况下,存储在内存中)。
    • 当访问根路径 / 时,req.session 会被初始化并包含一个名为 cookie 的属性,其中包含了与 Cookie 相关的信息。而 req.cookies 包含了客户端发送的所有 Cookie,包括由 express-session 创建的 user Cookie。
  3. 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-sessionconnect-session 的工作原理及其适用场景。


Node.js 关于 connect 的两个 session 中间件

背景

express-sessionconnect-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 并保存一些会话数据。

回到顶部