在express4.0之前的版本,像session,cookieParser之类的中间件是伴随express自动安装的,4.0之后的需要另行安装express-session模块。用的时候不再使用express.session(),而是直接使用session()。
connect-mongo 模块
把会话信息存储在数据库中,便于持久维护。为了使用这一功能,需要获得一个叫做 connect-mongo 的模块
npm install connect-mongo --save
Express 4.0之前
session存储在内存中
var express = require('express');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var app = express()
app.use(express.bodyParser())
app.use(express.cookiePaeser())
app.use(express.session({
secret: '12345',
name: 'testapp', //这里的name值得是cookie的name,默认cookie的name是:connect.sid
cookie: {maxAge: 80000 }, //设置maxAge是80000ms,即80s后session和相应的cookie失效过期
resave: false,
saveUninitialized: true,
}))
app.get('/',function(req,res){
if(req.session.name) {
console.log('your name is : ' + req.session.name + "!");
}
//每一次访问时,session对象的name会自动的保存或更新内存中的session中去。
req.session.name = '张三';
res.send("You're 张三. And the session expired time is: " + req.session.cookie.maxAge);
})
session的生命周期
session与发送到客户端浏览器的生命周期是一致的。而我们在挂载session的时候,通过option选项的cookie.maxAge成员,可以设置session的过期时间,以ms为单位(但是,如果session存储在mongodb中的话,任何低于60s(60000ms)的设置是没有用的)。如果maxAge不设置,默认为null,这样的expire的时间就是浏览器的关闭时间,即每次关闭浏览器的时候,session都会失效。
session存储在数据库中
var express = require('express');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var MongoStore = require('connect-mongo')(session);//session存储到数据库中
var app = express()
app.use(express.bodyParser())
app.use(express.cookiePaeser())
app.use(session({
secret: '12345',
name: 'testapp',
cookie: {maxAge: 80000 },
resave: false,
saveUninitialized: true,
store: new MongoStore({ //创建新的mongodb数据库
host: 'localhost', //数据库的地址,本机的话就是127.0.0.1,也可以是网络主机
port: 27017, //数据库的端口号
db: 'test-app' //数据库的名称。
})
}))
app.get('/',function(req,res){
if(req.session.name) {
console.log('your name is : ' + req.session.name + "!");
}
//每一次访问时,session对象的name会自动的保存或更新内存中的session中去。
req.session.name = '张三';
res.send("You're 张三. And the session expired time is: " + req.session.cookie.maxAge);
})
跟session的内存存储一样,只需增加store选项即可,app会自动替我们把session存入到mongodb数据,而非内存中。
session的生命周期:
由于session是存在服务器端数据库的,所以的它的生命周期可以持久化,而不仅限于浏览器关闭的时间。具体是由cookie.maxAge 决定:如果maxAge设定是1个小时,那么从这个因浏览器访问服务器导致session创建开始后,session会一直保存在服务器端,即使浏览器关闭,session也会继续存在。如果此时服务器宕机,只要开机后数据库没发生不可逆转的破坏,maxAge时间没过期,那么session是可以继续保持的。
当maxAge时间过期后,session会自动的数据库中移除,对应的还有浏览器的cookie。不过,由于connect-mongo的特殊机制(每1分钟检查一次过期session),session的移除可能在时间上会有一定的滞后。
Express 4.0及以后的版本
4.0之后的需要另行安装express-session模块。用的时候不再使用express.session(),而是直接使用session()。
同样的还有cookieParser,bodyParser,favicon
更多内容https://github.com/visionmedia/express/wiki/Migrating%20from%203.x%20to%204.x
基本类似,无太多区别
npm install express-session --save
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var dburl='mongodb://localhost/imooc'
app.use(session({
secret: '12345',
store: new MongoStore({
url : dburl,//数据库地址
collection : 'sessions'
})
}));