首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自上下文的Koa会话访问存储客户端连接

来自上下文的Koa会话访问存储客户端连接
EN

Stack Overflow用户
提问于 2020-04-19 02:01:11
回答 1查看 533关注 0票数 0

我正在使用nodejs和koa作为框架,外加koa-session和koa-redis。

代码语言:javascript
复制
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客户端?现在我正在创建一个新的连接:

代码语言:javascript
复制
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;
        }
        ...
    }
}

我在context ctx.session._sessCtx.store.client中发现了这个属性。将此属性用于该目的是否正确?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-28 02:14:43

我想我的问题跳得太远了。我用一个db.js文件重写了代码,并将我的redis连接放在那里,如下所示:

代码语言:javascript
复制
import { redisURI } from './config';
import Redis from 'koa-redis';

export const redisStore = Redis({url: redisURI});

所以现在我可以导入这个连接并在index.js上重用

代码语言:javascript
复制
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;

导入到另一个模块:

代码语言:javascript
复制
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;
        }
        ...
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61293830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档