首页 > 解决方案 > 记录会话用户 NodeJs NestJs

问题描述

我正在尝试记录会话用户,但它没有像我怀疑的那样工作。我在想我可以将它添加到中间件中,但显然这行不通。是否有我应该使用的策略或模式来实现这一点。

日志应该有不同的PassportAuthInterceptor用户,但它只使用中间件设置的最后一个

我看到他们在 log4js 文档中使用它,但显然这似乎没有我在下面演示的方式的意义。

我也看到有一个AuthLibrary.currentUser()电话,但我不确定如何做到这一点。

https://github.com/log4js-node/log4js-node/blob/master/docs/layouts.md#tokens

看到这是 NestJS,我可以以某种方式将用户注入服务,因为这可以解决我的问题

export class LoggerMiddleware implements NestMiddleware {

    private readonly logger = new AppLoggerService(LoggerMiddleware.name);

    public use(req, res, next: () => void) {

        log4js.getLogger('default').addContext('user', user.authName)

        next();
    }
}

在此处输入图像描述

标签: node.jsnestjslog4js-node

解决方案


所以这有点恶心,但它有效,我创建了 2 个记录器,一个是全局的(正常),一个是会话(范围请求)。问题是护照登录使用的任何类都不能引用 SessionLoggerService .. 这将使我将类拆分为全局和会话,以便他们调用的类可以使用正确的记录器。

https://github.com/nestjs/nest/issues/1870

@Injectable({scope: Scope.REQUEST})
export class SessionLoggerService implements LoggerService {

    public static logger = undefined;

    constructor(@Inject(REQUEST) private readonly req) {
        SessionLoggerService.logger = log4js.getLogger('user');

        const user = this.req && this.req.user ? this.req.user : null;

        if (user) {
            SessionLoggerService.logger.addContext('user', user.authName);
        } else {
            SessionLoggerService.logger.addContext('user', '');
        }
    }

    ....
}

推荐阅读