一.基于MySQL的实现方式

这种方式需要安装koa-session-minimal和koa-mysql-session两个依赖。

执行

npm install koa-session-minimal koa-mysql-session

项目配置:

const session = require('koa-session-minimal');   
const MysqlStore = require('koa-mysql-session'); 
const config = require('./config/default.js');  // 数据库配置 
const Koa = require('koa'); 
const app = new Koa(); 
 
// session存储配置 
const sessionMysqlConfig = { 
  user: config.database.USERNAME, 
  password: config.database.PASSWORD, 
  database: config.database.DATABASE, 
  host: config.database.HOST, 
}; 
 
 // 配置session中间件 
app.use(session({ 
  key: 'USER_SID', 
  store: new MysqlStore(sessionMysqlConfig) 
}));

这种方式会自动在数据库建立一个表:

在浏览器的cookie中会生成一个以 USER_SID 为键的cookie。通过ctx的session属性可以修改更新删除session的值。

缺点是每次对session的操作需要查询数据库,比较耗时。

二、基于Redis的实现方式

主要用到了koa-session2和ioredis。

npm install koa-session2 ioredis

项目配置:

// redis 
const session = require("koa-session2"); 
const Store = require("./config/Store"); 
 
// 使用redis作为session存储 
app.use(session({ 
  store: new Store(), 
  key: "SESSIONID",  // default "koa:sess" 
})); 
 
config/Store.js 
 
const Redis = require("ioredis"); 
const { Store } = require("koa-session2"); 
const redisConfig = require('./redis'); 
  
class RedisStore extends Store { 
    constructor() { 
        super(); 
        this.redis = new Redis(redisConfig); 
    } 
  
    async get(sid, ctx) { 
        let data = await this.redis.get(`SESSION:${sid}`); 
        return JSON.parse(data); 
    } 
  
    async set(session, { sid =  this.getID(24), maxAge = 1000000 } = {}, ctx) { 
        try { 
            // Use redis set EX to automatically drop expired sessions 
            await this.redis.set(`SESSION:${sid}`, JSON.stringify(session), 'EX', maxAge / 1000); 
        } catch (e) {} 
        return sid; 
    } 
  
    async destroy(sid, ctx) { 
        return await this.redis.del(`SESSION:${sid}`); 
    } 
} 
  
module.exports = RedisStore;

 这样,每次登陆就可以通过Redis来存储会话信息,由于Redis直接是运行在内存中的,因此速度会比较快。

通过get key 即可查看相应的session信息。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!