Session 支持可以通过使用 Connect 的 session 中间件来获得,为此通常我们同时需要在其前加上 cookieParser 中间件,它将解析和存储 cookie 数据于 req.cookies 中。
复制代码 代码如下:
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
默认情况下 session 中间件使用 Connect 内置的内存存储,然而还有其他多种实现方式。如 connect-redis 提供了一种 Redis 的 session 存储,它这可像下面这样被使用:
复制代码 代码如下:
var RedisStore = require('connect-redis')(express);
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new RedisStore }));
至此,req.session 和 req.sessionStore 属性将可以被所有路由和后继的中间件使用。在 req.session 上的所有属性都会在一个响应中被自动保存下来,譬如当我们想要添加数据到购物车:
复制代码 代码如下:
var RedisStore = require('connect-redis')(express);
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new RedisStore }));
app.post('/add-to-cart', function(req, res){
// 我们可能通过一个表单 POST 出多个 item
// (在些使用 bodyParser() 中间件)
var items = req.body.items;
req.session.items = items;
res.redirect('back');
});
app.get('/add-to-cart', function(req, res){
// 当返回时,页面 GET /add-to-cart
// 我们可以检查 req.session.items && req.session.items.length
// 来打印出提示
if (req.session.items && req.session.items.length) {
req.notify('info', 'You have %s items in your cart', req.session.items.length);
}
res.render('shopping-cart');
});
对于 req.session 对旬,它还有像 Session#touch()、Session#destroy()、 Session#regenerate() 等用以维护和操作 session 的方法。更多的详情请看 Connect Session 的文档。
十九、升级指南
对于使用 Express 1.x 的同学,如果你有很重要的程序需要升级到 2.x 以获得更好的支持,请看官方非常详细的迁移指南:#migration-guide
您可能感兴趣的文章: