我们的团队正在使用 Sails.js 框架维护一个应用程序,该应用程序充当较大应用程序的管理面板,因此不会看到太多流量。为了简化它并最大程度地减少移动部件,我们希望删除 sails 默认情况下用于其 session 存储的 Redis 依赖项 ( https://sailsjs.com/documentation/reference/configuration/sails-config-session )。
我们更愿意用用户计算机上的 cookie 存储或 LocalStorage 替换 session 存储。 Sails.js 声称他们的 session 存储严重依赖于express 的 session 存储。我们偶然发现了一个基于 cookie 的商店 ( https://github.com/expressjs/cookie-session ),但我对集成它感到困惑。我看到config/session.js
Sails 中的文件为其 session 存储定义了一个适配器,但我假设如果没有额外的包装器,它将与上述库不兼容。搜索 Sails 适配器将我带到数据库适配器而不是 session 存储适配器。我是否把这个问题过于复杂化了?上面的库(或者可能是一个简单的 LocalStorage 替代方案)可以绑定(bind)到 Sails 中来代替 Redis 吗?
最佳答案
我想可能是你把事情搞得太复杂了。这里有几个选项供您选择:
选项 1:默认 Sails session 存储
Sails 开箱即用,使用捆绑在底层 session 中间件中的默认内存存储。该 session 存储是内存存储,因此; a) 无法通过单个实例进行扩展,b) 要求每个用户在重新启动 Sails 应用程序后再次登录,c) 不建议用于生产环境。
话虽如此,我目前正在生产应用程序中使用默认内存存储。该应用程序非常基础且非常稳定,大约每季度进行一次更改。重新启动后,用户只需再次登录即可重新创建 session 。
对于首次启动应用程序来说,这无疑是一个可靠的选择,特别是如果您没有计划在不久的将来将其扩展到多个服务器。
要使用默认的 Sails session 存储,请不要对 config/session.js 文件进行任何更改,或者如果您已经配置了 Redis,请务必在 config/session.js 中注释掉以下行:
// adapter: 'redis',
// host: 'localhost',
// port: 6379,
// ttl: <redis session TTL in seconds>,
// db: 0,
// pass: <redis auth password>,
// prefix: 'sess:',
选项 2:可扩展的缓存存储
由于 Sails session 集成在很大程度上依赖于 Express 和 Connect,因此只要使用兼容版本,您就可以使用为 Connect/Express with Sails 编写的任何 session 适配器。
可提供基于 Connect 的兼容 Express session 存储的完整列表 here .
当谈到设计特定的缓存存储时,我认为两个明显的选择是 Memcached利用可用的 connect-memjs 包 here和 Redis Sails 开箱即用地支持。
Memcached 是一个简单的 volatile 缓存服务器。它允许您存储最多 1MB 的键/值对,因为 Redis 不仅仅是一个缓存服务器,但也可以充当缓存,存储最多 512MB 的键/值对。有关 Redis 与 Memcached 的更完整比较,请参阅 here .
选项 3:使用数据库
如果您的堆栈中已经配置了 Mongo、Couch、Dynamo 或 MSSql 数据库,则可以考虑将其用作 session 存储。他们都已经有了基于 Connect 的软件包。可以在上面基于 Connect 的兼容 Express session 存储的完整列表中找到每个链接的链接。
选项 2 和 3 的设置非常相似。示例可以在 Sails.js 网站上您提到的页面上找到。设置像 Mongo 这样的数据库非常简单:
A) 安装 connect-mongo 包
npm install connect-mongo --save
B) 更改 config/session.js 中的适配器:
adapter: 'connect-mongo',
C) 添加与您的数据库相关的可选适配器值:
url: 'mongodb://user:pass@host:port/database',
collection: 'sessions',
auto_reconnect: false,
ssl: false,
stringify: true
或者:Cookie
如果您根本不需要 session 。正如您提到的,您可以通过使用 cookie 将许多此功能推送给客户端。
Sails 内置了 getting 的功能和 setting cookies 。
关于管理 Cookie,您可以在基于 Controller 的 Cookie 的 Controller 级别执行此操作,也可以在获取更多全局数据的中间件中执行此操作。
要获取传入请求的 cookie,您可以使用点表示法。例如:
req.cookies.username;
要在响应上设置 cookie,您可以使用 JSON。例如:
res.cookie('username', 'John Smith', { maxAge: 900000, httpOnly: true });
在我看来,采用这种替代方案会产生大量的手动开销。您还必须考虑安全隐患,因为存储在 cookie 中的所有信息都可以通过浏览器的开发人员控制台访问。与使用 Sails session 相比,客户端只有 Sails 生成的 session ID 可用。
关于javascript - 用 cookie 或 localstorage 替换 sails.js redis session 存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47777385/