Stay Hungry,Stay Foolish!

express session store

express-session

http://www.expressjs.com.cn/en/resources/middleware/session.html

var session = require('express-session')
store

The session store instance, defaults to a new MemoryStore instance.

express-session提供了基本的会话功能, 让服务器端具有存储用户访问状态的能力, 例如登录过了,当前访问那个页面,用户临时选中的购物车等。

但是这个功能默认是内存存储的,所以一旦express服务器被重启,那么session数据将会丢失。

session-file-store

https://www.npmjs.com/package/session-file-store

为了解决上面这个问题, 有个中间件提供了本地文件的存储。

Session file store for Express and Connect. Also you can use it with Koa

Session file store is a provision for storing session data in the session file

 

var session = require('express-session');
var FileStore = require('session-file-store')(session);
 
var fileStoreOptions = {};
 
app.use(session({
    store: new FileStore(fileStoreOptions),
    secret: 'keyboard cat'
}));

 

这样不怕服务器出现宕机的情况,服务器重启后, 用户访问页面,访问的状态还在。

也可参考:

https://www.cnblogs.com/chyingp/p/express-session.html

但是随着应用流量的提升,单个服务器不足以满足应对高吞吐量的需求,一般是采用反向代理+N服务器拖挂。

这样本地文件的session存储方式就有问题了,如果用户第二个连接没有被分配到和第一个连接相同的服务器上,那么用户状态就丢失。

connect-mongo

应对上面的新问题,采用会话集中存储单一服务上,单个的express服务器不做任何状态存储的工作,制作http服务和路由服务,以及无状态的后台逻辑。

业界成熟的做法是,将session存储到 mongo或者redis上。

本文介绍存储到mongo的方法。

 

 

https://www.npmjs.com/package/connect-mongo

MongoDB session store for Connect and Express

const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
 
app.use(session({
    secret: 'foo',
    store: new MongoStore(options)
}));
// Basic usage
app.use(session({
    store: new MongoStore({ url: 'mongodb://localhost/test-app' })
}));

中文参考:

https://zhuanlan.zhihu.com/p/53600244

 

posted @ 2020-02-01 23:42  lightsong  阅读(501)  评论(0编辑  收藏  举报
Life Is Short, We Need Ship To Travel