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

Sem retorno de mensagem de erro

Estou com a versão 11 do angular, e não recebo a mensagem "Usuário já existe" no navegador, a requisição funciona normalmente, e é retornado um true, selecionando "alvaro", porem a validação não expõe a mensagem, o que poderia ser? segue abaixo código usado

novo-usuario.component.html

...
    <div class="form-group">
        <input type="text" class="form-control" formControlName="userName" placeholder="Usuário">
        <app-mensagem  *ngIf="novoUsuarioForm.get('userName')?.errors?.minusculo &&
        novoUsuarioForm.get('userName')?.touched"
        mensagem="Usuário deve ser em letra minúscula"></app-mensagem>
        <app-mensagem *ngIf="novoUsuarioForm.get('userName')?.errors?.usuarioExistente" 
            mensagem="Usuário já existe">
        </app-mensagem>
    </div>
...

novo-usuario.component.ts

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

usuario-existe.service.ts

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

novo-usuario.service.ts

...
  verificaUsuarioExistente(nomeUsuario: string) {
    return this.httpClient.get(`http://localhost:3000/user/exists/${nomeUsuario}`)
  }
...
2 respostas
solução!

Olá Lucas, tudo bom?

O método first deve vim depois do método map, separado por virgula, pois é ele quem encerra o fluxo de verificação. Só assim, o retorno do objeto com erro ou nulo vai poder ser usado pelo template. Segue o código abaixo.

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

Espero ter ajudado, Lucas. Bons estudos.

funcionou Diego, muito obrigado pela ajuda!