koa2實現session的兩種方式(基於Redis 和MySQL)


一.基於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信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM