Nestjs 应用程序中`@ntegral/nestjs-sentry` 包的依赖注入问题

Posted

技术标签:

【中文标题】Nestjs 应用程序中`@ntegral/nestjs-sentry` 包的依赖注入问题【英文标题】:Dependency injection issue for `@ntegral/nestjs-sentry` package in nestjs app 【发布时间】:2022-01-15 18:47:38 【问题描述】:

我对 Nestjs 中的这个包 @ntegral/nestjs-sentry 有疑问。我有一个在我的应用程序中使用的自定义记录器

@Injectable()
export class CustomLogger implements LoggerService 
  constructor(@InjectSentry() private readonly client: SentryService) 

  log(message: any, ...optionalParams: any[]) 
    this.client.instance().captureMessage(message, ...optionalParams);
  

然后我将其注入到用户控制器和 user.controller.spec.ts

describe('UsersController', () => 
  let controller: UsersController;

  beforeEach(async () => 
    const module: TestingModule = await Test.createTestingModule(
      controllers: [UsersController],
      providers: [
        CustomLogger,
        UsersService,
        SentryService,
      ],
    ).compile();

    controller = module.get<UsersController>(UsersController);
  );

  it('should be defined', () => 
    expect(controller).toBeDefined();
  );
);

我收到此错误

 FAIL  src/users/users.controller.spec.ts (9.449 s)
  ● UsersController › should be defined

    Nest can't resolve dependencies of the CustomLogger (?). Please make sure that the argument Symbol(SentryToken) at index [0] is available in the RootTestModule context.

    Potential solutions:
    - If Symbol(SentryToken) is a provider, is it part of the current RootTestModule?
    - If Symbol(SentryToken) is exported from a separate @Module, is that module imported within RootTestModule?
      @Module(
        imports: [ /* the Module containing Symbol(SentryToken) */ ]
      )

我已尝试将SentryService 添加到规范提供程序,但这并不能解决错误。有没有人遇到过这个问题,你是怎么解决的。

【问题讨论】:

【参考方案1】:

我遇到了完全相同的问题。似乎该库对其自己的 Inject 注释使用了不同的标记。通过使用为 SentryService 模拟提供的令牌,我能够在我的测试中修复它。

import  SENTRY_TOKEN  from '@ntegral/nestjs-sentry';

// ...

const module: TestingModule = await Test.createTestingModule(
  providers: [
  // ...
    
      provide: SENTRY_TOKEN,
      useValue:  debug: jest.fn() , // provide SentryService Mock here
    ,
  ],
)

【讨论】:

以上是关于Nestjs 应用程序中`@ntegral/nestjs-sentry` 包的依赖注入问题的主要内容,如果未能解决你的问题,请参考以下文章

在firebase云函数中部署nestjs

如何动态更改 Mongoose 提供程序中的集合或数据库的名称,Nestjs?

使用 NestJS 和 TypeOrm,在我运行 NestJS 应用程序后不会自动创建表

在nestjs应用程序中使用新的阿波罗服务器版本的打字稿错误

有啥方法可以访问 NestJS 守卫中处理程序方法的参数?

如何从控制器在nestjs应用程序中发送错误代码?