4
respostas

Erros no console durante a validação

No campo Full Name, se eu digito alguma coisa, no caso, digitei 'flavio', aparece no console os seguintes erros:

zone-evergreen.js:2952 GET http://localhost:3000/user.exists/flavio 404 (Not Found) ERROR HttpErrorResponse {headers: HttpHeaders, status: 404, statusText: "Not Found", url: "http://localhost:3000/user.exists/flavio", ok: false, …}

Sabendo que flavio é uma rota válida, pois acessamos http://localhost:4200/user/flavio.

O único arquivo que mencionei user.exists foi o signup.service.ts:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

const API_URL = "http://localhost:3000";

@Injectable({ providedIn: 'root' })
export class SignUpService {

    constructor(private http: HttpClient) {}

    checkUserNameTaken(userName: string) {

        return this.http.get(API_URL + '/user.exists/' + userName);
    }
}

É normal isso?

Também estou com problema na validação do user name, que ele deveria executar depois de 300ms, que é o que foi passado pelo debounceTime(300). Porém ele não respeita isso, nem termino de digitar já valida. Além de que o nome de usuario flavio ja existe, então deveria de dar erro, mas ele retorna User available para tudo.

import { Injectable } from '@angular/core';
import { SignUpService } from './signup.service';
import { AbstractControl } from '@angular/forms';

import { debounceTime, switchMap, map, first } from 'rxjs/operators';

@Injectable({ providedIn: 'root' })
export class UserNotTakenValidatorService {

    constructor(private signUpService: SignUpService) {}

    checkUserNameTaken() {

        return (control: AbstractControl) => {
            return control
                .valueChanges
                .pipe(debounceTime(300))
                .pipe(switchMap(userName =>
                    this.signUpService.checkUserNameTaken(userName)
                ))
                .pipe(map(isTaken => isTaken ? { userNameTaken: true } : null)) //faz um map do resultado que é isTaken, e aí ve se ele é true (ja existe), dai retorna userNameTaken true, se não retorna null
                .pipe(first()); //pega o primeiro valor e completa
        }
    }
}
4 respostas

Boa tarde, Graziela! Como vai?

Em relação ao primeiro problema, nessa atividade vc verá que a implementação correta do método checkUserNameTaken() seria:

checkUserNameTaken(userName: string) {

     return this.http.get(API_URL + '/user/exists/' + userName);
}

Sobre a sua segunda dúvida, vc precisa ter em mente que 300ms é muito pouco tempo! Então a vc irá parecer algo instantâneo! Experimente aumentar esse tempo para 5000ms ( equivalente a 5s ) que aí vc deverá perceber esse delay acontecendo.

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, minha aluna!

Ahhh, realmente. Erro de digitação. Corrigi e agora deu certo!

Sobre o segundo problema: é meio confuso a função toda, mas consegui captar a ideia. Porém mesmo assim, eu tentei alterar para 5000, mas sempre sai na hora, ele não espera o devido tempo para validar.

Sobre o segundo problema: é meio confuso a função toda, mas consegui captar a ideia. Porém mesmo assim, eu tentei alterar para 5000, mas sempre sai na hora, ele não espera o devido tempo para validar.

O que está confuso pra vc? É algum conceito? Diga aí pra mim que eu tento explicar!

Sobre o delay não funcionar como esperado, vc poderia compartilhar o seu código no github e mandar o link aqui? Assim eu poderei dar uma olhada mais a fundo no que está ocorrendo!

Esta confuso em relação do pipe, pois pesquisando vi que tem conceitos e formas de uso diferentes pelo Angular e pelo RxJS, sendo que pelo segundo, me aparenta resultar em um código mais enxuto em comparação com o primeiro. Certo? Mas o conceito dele ainda não está claro para mim!

Coloquei o arquivo com o código no drive. https://drive.google.com/drive/folders/12XPs3-eTIifcMiaWpy6bsc-gpCNaxek2?usp=sharing