這種方式須要安裝koa-session-minimal和koa-mysql-session兩個依賴。mysql
執行redis
npm install koa-session-minimal koa-mysql-session
項目配置:sql
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的值。npm
缺點是每次對session的操做須要查詢數據庫,比較耗時。瀏覽器
主要用到了koa-session2和ioredis。cookie
npm install koa-session2 ioredis
項目配置:session
// 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直接是運行在內存中的,所以速度會比較快。app
經過get key 便可查看相應的session信息。koa