【问题标题】:Using nestjs DI with class validator将 nestjs DI 与类验证器一起使用
【发布时间】:2022-02-15 11:04:15
【问题描述】:

好像真的是脑中的痛...

github 和其他网站上有很多关于此的帖子,其中许多归结为使用“类验证器”中的 useContainer,但它对我不起作用。

async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  useContainer(app, { fallback: true });
  await app.listen(3000);
}
bootstrap();

这是注射剂:

@ValidatorConstraint({ name: 'uniqueOnDatabase', async: true })
@Injectable()
export class UniqueOnDatabase implements ValidatorConstraintInterface {
    constructor(
        private readonly userService: UserService,
    ) {}
    public async validate(val: any, args: ValidationArguments): Promise<boolean> {
        const user = await this.userService.retrieveOneByEmail(val);
        return !user;
    }

    public defaultMessage(args: ValidationArguments): string {
        return `User with such an email address already exists in the DB`;
    }
}

我只想在 UniqueOnDatabase 类中使用我的 userService。

这是我提供 UniqueOnDatabase 的模块:

import { Module, CacheModule } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { CacheConfigService } from 'src/config/cache/config.service';
import { CacheService } from './services/cache.service';
import { CodeGenService } from './services/code-gen.service';
import { UserExistanceValidationPipe } from './pipes/user-existance.validation.pipe';
import { UsersModule } from 'src/users/users.module';
import { UniqueOnDatabase } from './validators/unique-on-database.validator';

@Module({
  providers: [
    CacheService,
    CodeGenService,
    UniqueOnDatabase,
  ],
  imports: [
    CacheModule.registerAsync({
      imports: [ConfigModule],
      useClass: CacheConfigService,
    }),
    UsersModule,
  ],
  exports: [
    CacheService,
    CodeGenService,
    UniqueOnDatabase,
  ],
})
export class SharedModule {}

【问题讨论】:

  • 它怎么不适合你?你得到一个特定的错误吗?它在开始时、构建时、运行时都不起作用吗?
  • @JayMcDoniel 例如,它会抛出以下错误Nest could not find Validator element (this provider does not exist in the current context)。我从class-validator 导入useContainer,然后在位于不同模块中的DTO 上使用UniqueOnDatabase
  • @JayMcDoniel 验证器元素是什么意思?
  • 你能展示你提供UniqueOnDatabase验证器的模块吗?
  • @JayMcDoniel Aaah,好像我已经找到了解决方案。我应该使用useContainer(app.select(SharedModule), { fallbackOnErrors: true }); 而不是我一开始所做的......

标签: nestjs


【解决方案1】:

感谢@Albert 回答您的问题。

添加@Albert 的答案以防万一有人错过了 cmets:

@JayMcDoniel Aaah,看来我已经找到了解决方案。我应该 使用过 useContainer(app.select(SharedModule), { fallbackOnErrors: 真的 });而不是我一开始做的……

再次感谢@Albert

【讨论】:

    猜你喜欢
    • 2022-08-02
    • 2021-03-09
    • 2019-05-16
    • 2017-09-16
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多