在node中session与redis的使用及遇到问题的处理

使用场景

session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登陆信息保存。
可以保存一些客户的常用信息,当客户端再次获取常用信息时,不必再从数据库中进行查询。
在使用session时数据会直接存储在内存中,数据过大会造成溢出,所以session需要配合数据库使用,这里使用redis存储session数据

使用redis需要在服务器中安装redis

node项目引入

npm install express-session --save
npm install redis connect-redis express-session --save

使用

const session = require('express-session');
const redis = require('redis')
let RedisStore = require('connect-redis')(session)
let client = redis.createClient()
app.use(session({
    store: new RedisStore({client}),
    secret: "secret",//相当于一个加密密钥,值可以是任意字符串
    resave: false,//强制session保存到session store中
    cookie: {
        maxAge: 1000 * 60 * 60,//设置有效时间,单位毫秒
    },
    saveUninitialized: false//强制没有‘初始化’的session保存到storage中
}))

session初始化需要在路由前面,否则会报session is undefined错误

session获取

app.get('/setSession', function (req, res) {
    req.session.test = 123;
    res.end();
});
app.get('/getSession', function (req, res) {
    console.log(req.session.test);
    res.end();
});

如果请求跨域会碰到获取不到req.session.test的情况。实际上,这是浏览器的同源策略导致的问题:不允许JS访问跨域的Cookie。

跨域设置

后端

引入cors

npm install cors --save

设置

const cors=require('cors');
app.use(cors({
    origin: 'http://localhost:3000',
    credentials: true
}));

origin: 配置Access-Control-Allow-Origin CORS标头,默认为'*',这里一定要设置为前端域名,否则cookie不会带到后端

前端

引入axios

npm install axios --save

设置

axios.defaults.withCredentials = true;//axios请求带上cookie

axios开启withCredentials后,服务器才能拿到cookie

永久链接: https://blog.cosdk.com/archives/1266