【问题标题】:Log Session User NodeJs NestJs记录会话用户 NodeJs NestJs
【发布时间】:2019-08-29 16:23:39
【问题描述】:

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

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.js nestjs log4js-node


    【解决方案1】:

    所以这有点恶心,但它有效,我创建了 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', '');
            }
        }
    
        ....
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 2016-02-17
      相关资源
      最近更新 更多