Koa Session 从上下文访问存储客户端连接
Koa Session access store client connection from context
我正在使用 nodejs 和 koa 作为框架,加上 koa-session 和 koa-redis。
import Koa from 'koa';
...
import session from 'koa-session';
import redisStore from 'koa-redis';
const app = new Koa();
app.keys = ["cookieKeys"];
app.use(session({
maxAge: 5184000000,
store: redisStore({url: 'redis://localhost:6379'})
}, app));
...
const server = app.listen(1339, () => {
console.log(`Server listening on port: 1339`);
});
export default server;
现在可以在redis上设置ctx.session.key = "value";
并获取ctx.sessios.key;
,因为连接已经建立。
我如何才能访问在其他模块的 koa-session 存储中使用的同一个 redis 客户端?现在我正在创建一个新连接:
import { Context, Next, Middleware } from 'koa';
import redis from 'koa-redis';
export default async (ctx: Context, next: Next): Promise<Middleware> => {
try {
return await next();
} catch (err) {
if (err.status !== 401) {
throw err;
}
const redisClient = await redis({url: 'redis://localhost:6379'}).client;
const tokenAccess = ctx.cookies.get('tokenAccess', {signed: true});
const tokenRefresh = ctx.session.tokenRefresh;
...
const isRefreshTokenRevoked = Number.isInteger(await redisClient.zrank('blacklist', tokenRefresh));
await redisClient.quit();
if (isRefreshTokenRevoked) {
throw err;
}
...
}
}
我在上下文 ctx.session._sessCtx.store.client
中找到了这个 属性。为此目的使用此 属性 是否正确?
我想我的问题跳了几步。我用 db.js
文件重写了代码,并将我的 redis 连接作为单例:
import { redisURI } from './config';
import Redis from 'koa-redis';
export const redisStore = Redis({url: redisURI});
所以现在我可以导入此连接并用于 index.js
和其他文件:
import Koa from 'koa';
...
import session from 'koa-session';
import { redisStore } from './db';
//import redisStore from 'koa-redis';
const app = new Koa();
app.keys = ["cookieKeys"];
app.use(session({
maxAge: 5184000000,
store: redisStore
//store: redisStore({url: 'redis://localhost:6379'})
}, app));
...
const server = app.listen(1339, () => {
console.log(`Server listening on port: 1339`);
});
export default server;
在另一个模块上导入:
import { Context, Next, Middleware } from 'koa';
import { redisStore } from './db';
export default async (ctx: Context, next: Next): Promise<Middleware> => {
try {
return await next();
} catch (err) {
if (err.status !== 401) {
throw err;
}
//const redisClient = await redis({url: 'redis://localhost:6379'}).client;
const tokenAccess = ctx.cookies.get('tokenAccess', {signed: true});
const tokenRefresh = ctx.session.tokenRefresh;
...
const isRefreshTokenRevoked = Number.isInteger(await redisStore.client.zrank('blacklist', tokenRefresh));
//const isRefreshTokenRevoked = Number.isInteger(await redisClient.zrank('blacklist', tokenRefresh));
//await redisClient.quit();
if (isRefreshTokenRevoked) {
throw err;
}
...
}
}
我正在使用 nodejs 和 koa 作为框架,加上 koa-session 和 koa-redis。
import Koa from 'koa';
...
import session from 'koa-session';
import redisStore from 'koa-redis';
const app = new Koa();
app.keys = ["cookieKeys"];
app.use(session({
maxAge: 5184000000,
store: redisStore({url: 'redis://localhost:6379'})
}, app));
...
const server = app.listen(1339, () => {
console.log(`Server listening on port: 1339`);
});
export default server;
现在可以在redis上设置ctx.session.key = "value";
并获取ctx.sessios.key;
,因为连接已经建立。
我如何才能访问在其他模块的 koa-session 存储中使用的同一个 redis 客户端?现在我正在创建一个新连接:
import { Context, Next, Middleware } from 'koa';
import redis from 'koa-redis';
export default async (ctx: Context, next: Next): Promise<Middleware> => {
try {
return await next();
} catch (err) {
if (err.status !== 401) {
throw err;
}
const redisClient = await redis({url: 'redis://localhost:6379'}).client;
const tokenAccess = ctx.cookies.get('tokenAccess', {signed: true});
const tokenRefresh = ctx.session.tokenRefresh;
...
const isRefreshTokenRevoked = Number.isInteger(await redisClient.zrank('blacklist', tokenRefresh));
await redisClient.quit();
if (isRefreshTokenRevoked) {
throw err;
}
...
}
}
我在上下文 ctx.session._sessCtx.store.client
中找到了这个 属性。为此目的使用此 属性 是否正确?
我想我的问题跳了几步。我用 db.js
文件重写了代码,并将我的 redis 连接作为单例:
import { redisURI } from './config';
import Redis from 'koa-redis';
export const redisStore = Redis({url: redisURI});
所以现在我可以导入此连接并用于 index.js
和其他文件:
import Koa from 'koa';
...
import session from 'koa-session';
import { redisStore } from './db';
//import redisStore from 'koa-redis';
const app = new Koa();
app.keys = ["cookieKeys"];
app.use(session({
maxAge: 5184000000,
store: redisStore
//store: redisStore({url: 'redis://localhost:6379'})
}, app));
...
const server = app.listen(1339, () => {
console.log(`Server listening on port: 1339`);
});
export default server;
在另一个模块上导入:
import { Context, Next, Middleware } from 'koa';
import { redisStore } from './db';
export default async (ctx: Context, next: Next): Promise<Middleware> => {
try {
return await next();
} catch (err) {
if (err.status !== 401) {
throw err;
}
//const redisClient = await redis({url: 'redis://localhost:6379'}).client;
const tokenAccess = ctx.cookies.get('tokenAccess', {signed: true});
const tokenRefresh = ctx.session.tokenRefresh;
...
const isRefreshTokenRevoked = Number.isInteger(await redisStore.client.zrank('blacklist', tokenRefresh));
//const isRefreshTokenRevoked = Number.isInteger(await redisClient.zrank('blacklist', tokenRefresh));
//await redisClient.quit();
if (isRefreshTokenRevoked) {
throw err;
}
...
}
}