gpt4 book ai didi

node.js - 在全局(单例)服务中使用特定于请求的上下文

转载 作者:行者123 更新时间:2023-12-02 20:41:58 25 4
gpt4 key购买 nike

我希望能够记录(如在 console.log 中)正在执行的每个 SQL 查询的登录用户。我正在使用 Nest.js 和 TypeORM(它是 Nest.js 的包装器)。我不知道如何将特定于请求的数据注入(inject)到全局(单个)提供程序中。

我使用的是 Nest.js v6.6.3 和 @nestjs/typeorm v6.1.3。

// current-user.service.ts
@Injectable({ scope: Scope.REQUEST })
export class CurrentUserService {
get currentUser(): string | null {
if (!this.request || !this.request.user) {
return null;
}

return this.request.user.email;
}

constructor(@Optional() @Inject(REQUEST) private request: Request) {}
}

// logger.service.ts
@Injectable()
export class LoggerService extends Logger {
constructor(private readonly moduleRef: ModuleRef) {
super();
}

log(message: any, context?: string) {
super.log(this.formatMessage(message), context);
}

private formatMessage(message: any) {
// ** This is the problematic code **
const currentUserService = this.moduleRef.get(CurrentUserService, {
strict: false,
});
return `[${currentUserService.currentUser}]: ${message}`;
}
}

// typeorm-logger.service.ts
@Injectable()
export class TypeormLogger implements Logger {
// Logger is imported from `typeorm`
constructor(private logger: LoggerService) {}

logQuery(query: string) {
// there are more params, don't matter for the sake of the argument
this.logger.log(query);
}
}

// logger.module.ts
@Module({
providers: [LoggerService, TypeormLogger],
exports: [LoggerService, TypeormLogger],
})
export class LoggerModule {}

// app.module.ts
@Module({
imports: [
TypeOrmModule.ForRootAsync({
imports: [LoggerModule],
inject: [TypeormLogger],
useFactory: (typeormLogger: TypeormLogger) => {
return {
type: 'mysql',
logger: typeormLogger,
keepConnectionAlive: false,
...
};
},
}),
],
})
export class AppModule {}

似乎使用moduleRef.get()无法进行跨Module解析,所以我尝试使用moduleRef.resolve() > 相反,但我仍然得到带有 request === undefinedCurrentUserService 。此外,resolve() 返回一个 Promise,这对于日志记录之类的东西来说并不理想。

上面是一个特定的用例,但可以概括 - 如果您的代码不是直接从 Controller 调用的,则无法注入(inject) transient 数据,例如经过身份验证的用户或请求 ID(两者都对日志记录有用) )。这看起来很奇怪,特别是因为 Nest.js 严重依赖 IoC。

最佳答案

我最终围绕 Nest.js 进行了工作,到目前为止它似乎工作得很好。请注意,我们在内部应用程序中使用它,因此我们的并发用户数较低,所以 YMMV。

该解决方案基于 asyncctx 包,如建议的 here 。您可以找到完整的解决方案here .

关于node.js - 在全局(单例)服务中使用特定于请求的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com