在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