session的使用以及持久化

实现方式

通过 express-session 对node-session进行管理
一般常用场景都是身份标识以及登陆操作

实现步骤

安装express-session及session持久化中间件

1
npm install express-session -S
  1. session持久化插件安装说明

    • mac、linux平台使用session-file-store
    1
    npm install session-file-store
    • win平台使用nedb-session-store
    1
    npm install nedb-session-store
  2. 导入及创建中间件

    OS X

    1
    2
    3
    4
    5
    6
    7
    8
    const session = require("express-session");
    const FileStore = require('session-file-store')(session);
    // 创建 session 中间件
    const sessionMiddleware = session({
    store:new FileStore(),//数据持久化方式,这里表示本地文件存储
    secret: 'keyboard cat', //加密key 可以随意书写
    cookie: { maxAge: 60000 }//两次请求的时间差 即超过这个时间再去访问 session就会失效
    })

    Windows

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var session = require("express-session")
    var NedbStore = require('nedb-session-store')( session );
    const sessionMiddleware = session({
    secret: "fas fas",
    resave: false,
    saveUninitialized: false,
    cookie: {
    path: '/',
    httpOnly: true,
    maxAge: 365 * 24 * 60 * 60 * 1000 // e.g. 1 year
    },
    store: new NedbStore({
    filename: 'path_to_nedb_persistence_file.db'
    })
    })
  3. 为express应用程序加入session中间件

    1
    app.use(sessionMiddleware);

    ::: tip
    以上代码都在app.js里面!
    :::

  4. session在路由中的使用

    1
    2
    3
    4
    router.get('/', function(req, res) { 
    const session = req.session;
    session.xxx //操作session
    });

使用样例

后台index.js

1
2
3
4
5
6
7
8
9
10
11
12
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
const session = req.session;
if (!session.num) {
session.num = 0;
}
console.log(++session.num);
res.render('index', { title: `Express这是第 ${session.num} 次访问` });
});

如果在设置的时效内,即使关了服务器再次打开,去别的界面也能访问session.num!

users.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
const session = req.session;
if(!session.num){
session.num = 0;
}
if(session.user){
let name = session.name;
res.send(name + "第" + ++session.num + "次登录");
}else{
res.send("还没有登录");
});

module.exports = router;

实际开发中遇到的问题

  1. post请求中进行redirect重定向无法跳转
    解决办法,不要返回两次head,在回调中增加return.