Add example(s) with external stores?
I would love to get this working for my case, but I find the following part of the readme extremely cryptic:
You can store the session content in external stores (Redis, MongoDB or other DBs) by passing options.store with three methods (these need to be async functions):
get(key, maxAge, { rolling }): get session object by key set(key, sess, maxAge, { rolling, changed }): set session object for key, with a maxAge (in ms) destroy(key): destroy session for key
- How to pass "options.store with three methods"?
- On the
setmethod, what is thesessparameter?
Would anyone be kind enough to add an example of the above (especially using redis)? I searched everywhere and it is still a mystery to me how to get it working...
Thanks!! Daniel
Maybe you can check out this module as an example.
https://github.com/eggjs/egg-session-redis/blob/master/app.js#L12
Thanks! Is this going in the right direction?
// middleware/installSession.js
const session = require('koa-session');
const RedisStore = require('koa-redis');
const ONE_DAY = 1000 * 60 * 60 * 24;
module.exports = function installSession(app) {
app.keys = [process.env.SECRET];
app.use(session({
store: new RedisStore({
url: process.env.REDIS_URL,
key: process.env.REDIS_STORE_KEY,
async get(key) {
const res = await redis.get(key);
if (!res) return null;
return JSON.parse(res);
},
async set(key, value, maxAge) {
maxAge = typeof maxAge === 'number' ? maxAge : ONE_DAY;
value = JSON.stringify(value);
await redis.set(key, value, 'PX', maxAge);
},
async destroy(key) {
await redis.del(key);
},
})
}, app));
};
Then in my main server file:
// server.js
...
const middleware = require('./middleware');
const app = new Koa();
const server = http.createServer(app.callback());
// session middleware
middleware.installSession(app);
// other middleware, which also get app as a parameter
middleware.installFirebaseAuth(app);
...
const PORT = parseInt(process.env.PORT, 10) || 3000;
server.listen(PORT);
console.log(`Listening on port ${PORT}`);
But then how do I access the session and its methods from inside other middlewares? Like in the installFirebaseAuth middleware, I want to finally get/set session values:
...
module.exports = function installFirebaseAuth(app, { rootPgPool }) {
...
const verifyAccessToken = async (ctx, next) => {
...
const accessToken = getAccessToken(ctx);
const fid = getFID(ctx);
const getRedisKey = sprintf(process.env.REDIS_STORE_KEY, {
fid
});
// trying to access the session, none work
console.log('ctx.session', ctx.session);
console.log('ctx.session.get():', ctx.session.get(getRedisKey));
console.log('ctx.req.session', ctx.req.session);
const redisValue = await ctx.req.session.get(getRedisKey);
...
}
}
ctx.session returns {}
ctx.session.get() returns ctx.session.get is not a function
ctx..req.session returns undefined
Any clues? Thanks!!
@danrocha I got the same error with store get, set function finally, I change to use koa-session2 and ioredis maybe you should check out this issues https://github.com/Secbone/koa-session2/issues/39
The usage keep the same with cookie base session, you just set value by ctx.session= and get user's session data from ctx.session
you can check out the test cases for more examples for how to use:
https://github.com/koajs/session/blob/master/test/store.test.js
I have the same problem.Any examples?Thanks in advance.
Check out below for an in-memory session store: https://github.com/jmitchell38488/koa-session-local
The docs describe an object must have the set, get and destroy functions. It can be defined however you like, as long as the object passed contains those three functions.