2
respostas

Minha função não está devolvendo uma string

No código abaixo, dentro da função valida(), atente para a seguinte linha:

let mensagem = buscaMensagem(input.validity, tipoDeInput);

Dentro do buscaMensagem, antes do return, o console.log me mostra a string que eu gostaria de buscar. Porém, quando eu dou console.log da mensagem, ele me mostra undefined. O que está acontecendo?

"use strict"

export function valida(input){
    const tipoDeInput = input.dataset.tipo;
    const campoDeErro = input.parentElement.querySelector('.input-mensagem-erro');

    if (validadores[tipoDeInput]){
        validadores[tipoDeInput](input);

    }

    if (input.validity.valid){
        input.parentElement.classList.remove('input-container--invalido');
    }else{
        input.parentElement.classList.add('input-container--invalido');

        let mensagem = buscaMensagem(input.validity, tipoDeInput);
        // esse console.log devolve undefined
        console.log(mensagem);
        campoDeErro.innerHTML = mensagem;
    }   

}

const mensagensDeErro = {
    nome: {
        valueMissing: 'O campo nome precisa ser preenchido.',
    },
    email: {
        typeMismatch: 'Você precisa colocar um e-mail válido.',
        valueMissing: 'O campo email precisa ser preenchido.',
    },
    senha: {
        patternMismatch: 'A senha precisa ter pelo menos 6 caracteres e deve conter pelo menos uma letra um número.',
        valueMissing: 'O campo senha precisa ser preenchido.',
    },
    dataNascimento: {
        customError: 'Só é permitido o cadastro para maiores de 18 anos.',
        valueMissing: 'O campo data de nascimento precisa ser preenchido.',
    },
}

/* Lista de erros possíveis, na ordem de validação */
const errosPossiveis = ['valueMissing', 'typeMismatch', 'patternMismatch', 'customError'];

/*
Objeto com chave validadores e valor de respectivas funções validadoras
*/
const validadores = {
    dataNascimento: input => validaDataNascimento(input),
}

function buscaMensagem(validade, tipo){
    errosPossiveis.forEach(erro => {
        if (validade[erro]){
            //esse console log devolve o string correto da constante mensagens de erro
            console.log(mensagensDeErro[tipo][erro]);
            return mensagensDeErro[tipo][erro];
        }
        //Mensagem padrão caso não encontre o erro;
        return 'Este campo não está válido';
    });

}

function validaDataNascimento(input){
    /*
Omitido, não é importante aqui
*/
}
2 respostas

Descobri qual foi o erro:

Coloquei o return dentro da arrow function e portanto o retorno era da arrow function e não da função buscaMensagem. Resolvi mudando para esse código:

function buscaMensagem(validade, tipo){
    let mensagem = 'Este campo não está válido';
    errosPossiveis.forEach(erro => {
        if (validade[erro]){
            mensagem = mensagensDeErro[tipo][erro];
        }
    });
    return mensagem;

}

Porém perdi o early return que eu estava tentando fazer no primeiro método. Tem alguma forma de conseguir o early return?

O post foi fechado pois o curso foi descontinuado e não faz mais parte da grade oficial.
  • Você pode acessar o curso atualizado aqui.