我是Express
新手。由于Express 4.x
已删除捆绑的中间件。
我需要使用任何我想要使用的中间件。当我在github上阅读带有express-session和cookie-session的自述文件时,我觉得很难理解其中的区别。
所以我尝试编写简单的代码来弄清楚。我为每个中间件运行两次。
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'}
这让我很困惑。那么如何用基本用法来解释结果呢?它们之间的区别是什么?我应该什么时候使用它们?
答案 0 :(得分:34)
基本上,express-session
更抽象,它支持不同的会话存储(如文件,数据库,缓存等等)。
cookie-session
是一个基于cookie的简单/轻量级(cookie是唯一支持的存储引擎:所有会话信息都存储在客户端,cookie中)会话实现。这种会议可能因其Rails implementation而闻名。
答案 1 :(得分:8)
这两者之间的基本区别与会话数据的存储方式和位置有关。 Cookie会话主要用于轻量级会话应用,其中会话数据存储在Cookie中但位于客户端[浏览器] 中,而快速会话仅在客户端的cookie中存储会话标识符,同时将会话数据完全存储在服务器上。 Cookie会话在后端未使用数据库的应用程序中很有用。但是,会话数据不能超过cookie大小。在使用数据库的情况下,它就像缓存一样,可以停止频繁的数据库查找,而且价格昂贵。
答案 2 :(得分:4)
让我分享一下我发现的一个重要区别:安全Cookie 。
我有一个处理SSL的nginx代理后面的节点进程。
我尝试使用快速会话,但我无法启用安全Cookie,请参阅issue here。
然后我尝试使用几乎相同的代码,但使用 cookie-session 代替
const expressSession = require('cookie-session')
var expiryDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days
const session = expressSession({
secret: sessionSecret,
resave: false,
saveUninitialized: true,
cookie: {
secureProxy: true,
httpOnly: true,
domain: 'example.com',
expires: expiryDate
}
})
app.use(session)
我刚刚将require('express-session')
更改为require('cookie-session')
并添加了secureProxy: true,
:一切都开箱即用。
另请注意,这两个软件包都由expressjs维护,因此在我的用例中我很幸运地发现cookie会话符合我的需求。
答案 3 :(得分:4)
express-session
将会话标识符存储在cookie中,而实际会话数据存储在后端会话存储中,如connect-redis
,其中cookie-session
允许您将会话数据存储在cookie中(客户端)。
来自cookie-session
的文档:
用户会话可以通过两种主要方式存储在cookie中:在...上 服务器或客户端。该模块将会话数据存储在 cookie中的客户端,而像快递会话存储的模块 只有cookie上的客户端上的会话标识符并存储 服务器上的会话数据,通常在数据库中。
使用cookie-session
的主要优势是,当您拥有群集node.js
应用时,您就不必依赖于在分叉流程之间共享会话数据。
答案 4 :(得分:4)
官方Express.js documentation是指
这两个模块之间的主要区别在于它们如何保存cookie会话数据。
express-session
中间件将会话数据存储在服务器上;它将会话ID仅保存在cookie本身中,而不保存会话数据。默认情况下,它使用内存存储,并且不适用于生产环境。在生产中,您需要设置一个可扩展的会话存储;请参阅兼容的会话存储列表。相反,
cookie-session
中间件实现了cookie支持的存储:它将整个会话序列化为cookie,而不仅仅是会话密钥。仅当会话数据相对较小且容易编码为原始值(而不是对象)时才使用它。尽管浏览器每个cookie至少应支持4096字节,但为确保不超出限制,每个域的大小不得超过4093字节。另外,请注意,cookie数据对于客户端是可见的,因此,如果有任何理由确保其安全或晦涩,则express-session
可能是一个更好的选择。
答案 5 :(得分:0)
获取非空的console.log(req.session),您需要在记录之前设置会话值。
来自cookie-session repo(https://github.com/expressjs/cookie-session):
app.get('/', function (req, res, next) {
req.session.views = (req.session.views || 0) + 1
console.log(req.session)
res.end(req.session.views + ' views')
})
如果你从未在req.session对象上设置任何信息,它将返回空。
答案 6 :(得分:0)
v4-> cookie会话是(建立基于cookie的会话。)等于-> v3 express.cookieSession
v4-> express-session是(建立基于服务器的会话(仅开发))。等于-> v3 express.session