Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Erro not find validator

Após concluir o construção do nosso Decorator custom, eu continue com erro, mesmo após a configuração passada pelo professor no arquivo main.ts Não estou consiguindo identificar da onde o erro esta vindo. Antes da configuração no main.ts, o erro que tinha era o mesmo do professor.

Já tentei parar o projeto e iniciar dnv, pensando que poderia ser algum start do Nest.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Imagem do erro acima:

Arquivo main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
import { useContainer } from 'class-validator';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      whitelist: true,
      forbidNonWhitelisted: true,
    }),
  );

  useContainer(app.select(AppModule), { fallback: true });
  await app.listen(3000);
}
bootstrap();

Arquivo email-is-unique.validator.ts

import {
  ValidationArguments,
  ValidationOptions,
  ValidatorConstraint,
  ValidatorConstraintInterface,
  registerDecorator,
} from 'class-validator';
import { UserRepository } from '../user.repository';
import { Injectable } from '@nestjs/common';

@Injectable()
@ValidatorConstraint({ async: true })
export class EmailIsUniqueValidator implements ValidatorConstraintInterface {
  constructor(private useRepository: UserRepository) {}

  async validate(
    value: any,
    validationArguments?: ValidationArguments,
  ): Promise<boolean> {
    const userExisting = await this.useRepository.emailIsUnique(value);

    return !userExisting;
  }
}

export const EmailIsUnique = (optionsValidator: ValidationOptions) => {
  return (object: Object, propety: string) => {
    registerDecorator({
      target: object.constructor,
      propertyName: propety,
      options: optionsValidator,
      constraints: [],
      validator: EmailIsUniqueValidator,
    });
  };
};

arquivo users.module

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserRepository } from './user.repository';
import { EmailIsUniqueValidator } from './validator/email-is-unique.validator';

@Module({
  controllers: [UserController],
  providers: [UserRepository, EmailIsUniqueValidator],
})
export class UserModule {}

arquivo user.repository.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class UserRepository {
  private users = [];

  async salvar(user) {
    this.users.push(user);

    return true;
  }

  async listAllUsers() {
    return this.users;
  }

  async emailIsUnique(email: string) {
    const possibleUser = this.users.find((user) => user.email === email);

    return possibleUser !== undefined;
  }
}
2 respostas

Oi, Matheus. Tudo certinho?

Parece que o Nest.js não está conseguindo encontrar o elemento Validator que você definiu. Isso geralmente ocorre quando o Nest.js tenta resolver uma dependência que não foi registrada corretamente no contexto da aplicação. Vamos verificar alguns pontos:

  1. Verifique se o EmailIsUniqueValidator está devidamente importado e registrado como um provider no módulo correspondente. Confirme se todos os nomes estão corretos e se não há nenhum erro de digitação.

  2. Confira se o UserRepository está sendo injetado corretamente no EmailIsUniqueValidator. O construtor do seu validador parece estar correto, mas confirme se o UserRepository está exportado e se está acessível para injeção de dependência.

  3. Certifique-se de que o UserRepository está registrado como um provider. Se o repositório não estiver registrado como um provider, ele não estará disponível para injeção de dependência.

  4. Confira se o método emailIsUnique está sendo chamado corretamente. No seu código, você chama this.useRepository.emailIsUnique(value), mas no contexto fornecido, o método no UserRepository é chamado emailIsUnique. Verifique se o nome do método está correto e se ele está acessível.

  5. Reinicie o servidor do Nest.js. Às vezes, mudanças nos providers e nos módulos podem não ser refletidas até que o servidor seja reiniciado.

Se após verificar esses pontos o problema persistir, por favor, me encaminhe seu código completo para eu poder te ajudar de forma mais assertiva. Pode mandar pelo GitHub, se preferir :)

Fico na torcida para que se resolva. Abraços!

solução!

Oii bom dia! eu consegui resolver de um outra maneira. eu segui o que falou mas não chegou a resolver, até pedi para outras pessoas darem um olhada pra verificar se eu não deixei passar nada, porem acabou que eu resolvi de uma outra maneira. Não sei ao certo o que era, mas minhas suspeitas é que fosse a versão de alguma dependencia do projeto, pois quando clonei o projeto referente a aula e rodei funcionou. Acredito que alguma coisa no meu node não instalou direito ou deu conflito de versão. Ele não estava reconhecendo nada que eu importava do class-validator, Quando usei o projeto clonado funcinou normalmente, e quando fui fazer a comparação, apenas o as versões do packge.json estavam diferentes