node.js - 记录会话用户 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();
}
}
解决方案
所以这有点恶心,但它有效,我创建了 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', '');
}
}
....
}
推荐阅读
- c++ - 预编译头特征
- javascript - 无法编辑
- android - 如何在 Kotlin 中定义使用 @DrawableRes 注释的接口?
- sql-server - 同一天,同一客户,不同分行交易
- javascript - 在 Windows 开始菜单中更改 Electron App 图标
- python - 如何使用运动检测触发相机?
- javascript - React.js useState Hook 需要一段时间来更新状态
- c# - 如何在 .net 核心上配置 AddAuthorization 以允许多个令牌提供者的角色?
- angular - Angular中基于页面大小的多个API调用
- css - SASS:增加字体大小会增加所有内容的大小