2
respostas

Nao ah mensagem de usuario ja existente nao aparece

novo-usuario.conponent.ts

import { UsuarioExisteService } from './usuario-existe.service';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { minusculoValidator } from './minusculo.validator';
import { NovoUsuario } from './novo-usuario';
import { NovoUsuarioService } from './novo-usuario.service';

@Component({
  selector: 'app-novo-usuario',
  templateUrl: './novo-usuario.component.html',
  styleUrls: ['./novo-usuario.component.css'],
})
export class NovoUsuarioComponent implements OnInit {
  novoUsuarioForm!: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
    private novoUsuarioService: NovoUsuarioService,
    private usuarioExistenteService: UsuarioExisteService
  ) {}

  ngOnInit(): void {
    this.novoUsuarioForm = this.formBuilder.group({
      email: ['', [Validators.required, Validators.email]],
      fullName: ['', [Validators.required, Validators.minLength(4)]],
      userName: [
        '',
        [minusculoValidator],
        [this.usuarioExistenteService.usuarioJaExiste()],
      ],
      password: [''],
    });
  }

  cadastrar() {
    const novoUsuario = this.novoUsuarioForm.getRawValue() as NovoUsuario;
    console.log(novoUsuario);
  }
}

novo-usuario.component.html

div class="form-group">
    <input
      placeholder="Usuário"
      class="form-control"
      formControlName="userName"
    />
    <app-mensagem
      *ngIf="
        novoUsuarioForm.get('userName')?.errors?.minusculo &&
        novoUsuarioForm.get('userName')?.touched
      "
      mensagem="Usuario deve ser letra minuscula"
    ></app-mensagem>
    <app-mensagem
      *ngIf="novoUsuarioForm.get('userName')?.errors?.usuarioExistente"
      mensagem="Usuario ja existe"
    ></app-mensagem>

usuario-existe.service.ts

 return (control: AbstractControl) => {
      return control.valueChanges.pipe(
        switchMap((nomeUsuario) =>
          this.novoUsuarioService.verificaUsuaruioExisente(nomeUsuario)
        ),
        map((usuarioExiste) =>
          usuarioExiste ? { usuarioExistente: true } : null
        ),
        first()
      );
    };

novo-usuario.service.ts

 verificaUsuaruioExisente(nomeUsuario: string) {
    return this.http.get('http://localhost:3000/user/exists/${nomeUsuario}^');
  }
}

o erro "usuario ja existe nao aparece" pls help me

2 respostas

O erro "usuário já existe não aparece" pode estar relacionado ao fato de que o serviço usuarioExistenteService que é responsável por verificar se o nome de usuário já existe não está sendo chamado corretamente.

Na declaração do userName no método ngOnInit no componente NovoUsuarioComponent, há uma chamada para o método this.usuarioExistenteService.usuarioJaExiste() que não parece estar sendo usada corretamente. Este método retorna uma função que é usada como validador personalizado para o campo userName, mas a ordem dos parâmetros do método group está incorreta, o que faz com que o validador personalizado não seja chamado corretamente.

Para corrigir esse problema, você pode alterar a ordem dos parâmetros passados para o método group para que o validador personalizado seja o terceiro parâmetro e alterar o nome do método usuarioJaExiste para validarUsuarioExistente ou outro nome que faça mais sentido para a validação personalizada. Além disso, você também precisa alterar o retorno do método usuarioJaExiste para que ele retorne a função de validação personalizada.

Segue abaixo uma possível solução para o problema:

import { UsuarioExisteService } from './usuario-existe.service';
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { minusculoValidator } from './minusculo.validator';
import { NovoUsuario } from './novo-usuario';
import { NovoUsuarioService } from './novo-usuario.service';

@Component({
  selector: 'app-novo-usuario',
  templateUrl: './novo-usuario.component.html',
  styleUrls: ['./novo-usuario.component.css'],
})
export class NovoUsuarioComponent implements OnInit {
  novoUsuarioForm!: FormGroup;

  constructor(
    private formBuilder: FormBuilder,
    private novoUsuarioService: NovoUsuarioService,
    private usuarioExistenteService: UsuarioExisteService
  ) {}

  ngOnInit(): void {
    this.novoUsuarioForm = this.formBuilder.group({
      email: ['', [Validators.required, Validators.email]],
      fullName: ['', [Validators.required, Validators.minLength(4)]],
      userName: [
        '',
        [minusculoValidator],
        this.usuarioExistenteService.validarUsuarioExistente(),
      ],
      password: [''],
    });
  }

  cadastrar() {
    const novoUsuario = this.novoUsuarioForm.getRawValue() as NovoUsuario;
    console.log(novoUsuario);
  }
}

Observe que o método usuarioJaExiste foi renomeado para validarUsuarioExistente e agora retorna uma função de validação personalizada. Além disso, o nome do método validarUsuarioExistente foi usado como argumento no terceiro parâmetro da chamada do método group. Isso deve permitir que o validador personalizado seja chamado corretamente e exiba a mensagem de erro apropriada quando o usuário já existe.

Olá! No meu projeto a mensagem só passou a funcionar depois de ajustar a linha

userName: [
        '',
        [minusculoValidator],
        [this.usuarioExistenteService.usuarioJaExiste()],
      ],

para


userName: ['', [minusculoValidator, Validators.required], [this.usuarioExistenteService.validarUsuarioExistente()]],

no novo-usuario.conponent.ts