我是新来的快递员。由于 Express 4.x 已删除捆绑的中间件。
我想使用的任何中间件都应该是必需的。当我在github上阅读express-session和cookie-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);
对于cookie-session
,我总是在终端中得到{}
。
对于express-session
,我得到这样的东西。
req.session: { cookie: {
path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true
}
}
req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}
我真的很困惑。那么如何用基本用法来解释结果呢?它们之间有什么区别?我应该什么时候使用它们?
9条答案
按热度按时间pod7payv1#
基本上,
express-session
更抽象,它支持不同的会话存储(如文件,DB,缓存等)。cookie-session
是一个简单/轻量级的基于cookie的(cookie是唯一支持的存储引擎:在cookie)会话实现中,所有会话信息都存储在客户机上。这类会话最著名的可能是它的Rails实现。jhkqcmku2#
这两者之间的基本区别涉及会话数据存储的方式和位置。Cookie session主要用于轻量级会话应用,会话数据存储在cookie中,但在 * 客户端[浏览器]* 内,而Express Session仅在客户端的cookie中存储会话标识符,而将会话数据完全存储在服务器上。Cookie Session在后端不使用数据库的应用程序中很有用。但是,会话数据不能超过cookie大小。在使用数据库的情况下,它就像一个高速缓存,以停止频繁的数据库查找,这是昂贵的。
zzzyeukh3#
express-session
将会话标识符存储在cookie中,而实际的会话数据驻留在后端会话存储中,如connect-redis
,其中cookie-session
允许您将会话数据存储在cookie中(客户端)。从
cookie-session
的文档中:用户会话可以通过Cookie以两种主要方式存储:在服务器或客户端上。此模块将客户端上的会话数据存储在cookie中,而像express-session这样的模块仅将客户端上的会话标识符存储在cookie中,并将会话数据存储在服务器上,通常存储在数据库中。
使用
cookie-session
的主要优点是,当你有一个集群node.js
应用程序时,你不必依赖于在分叉进程之间共享会话数据。z6psavjg4#
让我分享我发现的一个重要差异:安全Cookie。
我在nginx代理后面有一个处理SSL的节点进程。
我尝试使用express-session,但无法启用安全cookie,请参阅此处的问题。
然后我尝试了几乎相同的代码,但使用了 cookie-session,类似于
我只是将
require('express-session')
更改为require('cookie-session')
并添加了secureProxy: true,
:一切都很顺利。还要注意的是,这两个包都是由expressjs维护的,所以在我的用例中,我很幸运地发现cookie-session符合我的需要。
fae0ux8s5#
官方的Express.js文档引用了
这两个模块之间的主要区别在于它们如何保存cookie会话数据。
express-session
中间件在服务器上存储会话数据;它只在cookie本身中保存会话ID,而不是会话数据。默认情况下,它使用内存中存储,并且不是为生产环境设计的。在生产环境中,您需要设置一个可伸缩的会话存储;查看兼容会话存储的列表。相比之下,
cookie-session
中间件实现了cookie支持的存储:它将整个会话序列化为cookie,而不仅仅是会话密钥。仅当会话数据相对较小且易于编码为基元值(而不是对象)时才使用它。虽然浏览器应该支持每个cookie至少4096字节,但为了确保不超过限制,每个域的大小不要超过4093字节。此外,请注意cookie数据对客户端是可见的,因此如果有任何理由保持其安全或模糊,那么express-session
可能是更好的选择。yqlxgs2m6#
getannon-empty console.log(req.session)需要在记录之前设置会话值。
从cookie会话存储库(https://github.com/expressjs/cookie-session):
如果您从未在req.session对象上设置任何信息,它将返回空。
hpcdzsge7#
v4-> cookie-session is(Establish cookie-based sessions.)equals in ->v3 express.cookieSession
v4-> express-session是(建立基于服务器的会话(仅限开发))。equals in ->v3 express.session
nzkunb0c8#
这里有一个简单的解释:-
用户会话可以通过两种主要方式使用cookie进行存储:服务器端或客户端。
*express-session只在客户端的cookie中存储会话标识符,并将会话数据存储在服务器上,通常存储在数据库中。
*cookie-session将客户端的会话数据存储在cookie中
w7t8yxp59#
express-session
将会话数据存储到可配置的后端,从内存到任意数量的数据库,因此允许基本上无限的会话存储。cookie-session
将会话数据存储到cookie中,因此仅限于4k字节以下的会话存储位。其余的大部分差异都是这个决定的后果:
cookie-session
不依赖于外部数据存储(因此需要设置、配置和维护的基础架构更少)。cookie-session
在负载均衡器后工作,无需启用/配置“sticky-sessions”。