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

Erro Undefined

Estou com um erro na hora de validar o paciente https://cursos.alura.com.br/course/javascript-programando-na-linguagem-web/task/24380

O seguinte erro:

Uncaught TypeError: Cannot read property 'peso' of undefined
    at validaPaciente (form.js:81)
    at validaPaciente (form.js:83)
    at validaPaciente (form.js:83)
    at HTMLButtonElement.<anonymous> (form.js:10)

Referente a este código:

function validaPaciente(paciente){
    var erros = [];

    if(!validaPeso(paciente.peso)) erros.push("Peso inválido");

    if(!validaPaciente(paciente.altura)) erros.push("Altura inválida");


}

Não consegui entender onde está errado. Ou se tem algo a ver com o objeto paciente

9 respostas

tem a ver com o objeto paciente, o parâmetro está chegando undefined. Tenta verificar, no ponto onde vc faz a invocação da função, o estado desse objeto. A partir daí tenta fuçar para descobrir pq ele não está sendo carregado.

O paciente está assim:

function obtemPacienteDoFormulario(form){

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }

    return paciente;
}

Ainda estou perdido haha

Acredito que seja na hora que você está retornando o escopo de execução que executa a função validaPaciente, nesse ponto tem o objeto paciente, mas ele não tem a propriedade peso. coloque aqui o código onde está sendo executado a função validaPaciente.

Aqui está uma parte do meu código do Formulário :

var botaoAdicionar = document.querySelector("#adicionar-paciente");
botaoAdicionar.addEventListener("click", function(event) {
    event.preventDefault();

    var form = document.querySelector("#form-add");
    var paciente = obtemPacienteDoFormulario(form);

    var pacienteTr = montaTr(paciente);

    var errosPaciente = validaPaciente(paciente);


    if(errosPaciente.length > 0){
        exibeMensagensDeErro(errosPaciente);
        return;
    }

    // adiciona paciente na tabela
    var tabela = document.querySelector("#tabela-pacientes");

    tabela.appendChild(pacienteTr);

    form.reset();

});

function exibeMensagensDeErro(errosPaciente){
    var ul = document.querySelector("#mensagens-erro");
    errosPaciente.forEach(function(erro){
        var li = document.createElement("li");
        li.textContent = erro;
        ul.appendChild(li);
    })
}

function obtemPacienteDoFormulario(form){

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }

    return paciente;
}

function montaTr(paciente){

    var pacienteTr = document.createElement("tr");

    pacienteTr.classList.add("paciente");

    // \/ jeito não recomendado
    var nomeTd = document.createElement("td");
    nomeTd.classList.add("info-nome");
    nomeTd.textContent = paciente.nome;
    // --- 

    pacienteTr.appendChild(nomeTd);
    pacienteTr.appendChild(montaTd(paciente.peso, "info-peso"));
    pacienteTr.appendChild(montaTd(paciente.altura, "info-altura"));
    pacienteTr.appendChild(montaTd(paciente.gordura, "info-gordura"));
    pacienteTr.appendChild(montaTd(paciente.imc, "info-imc"));

    return pacienteTr
}

function montaTd(dado,classe){
    var td = document.createElement("td");
    td.textContent = dado;
    td.classList.add(classe);

    return td;
}

function validaPaciente(paciente){
    var erros = [];

    if(!validaPeso(paciente.peso)) erros.push("Peso inválido");

    if(!validaPaciente(paciente.altura)) erros.push("Altura inválida");


}

A outra parte em outro arquivo são funções para calcular o imc etc

Oi Nikolai,

Acho que a função obtemPacienteDoFormulario não está conseguindo obter o peso do paciente do formulário. Pode ser que algo esteja errado ou trocado em seu HTML.

Colaca aqui o seu <form> completo por favor e além disso adicione um console.log ao fim da sua função obtemPacienteDoFormulario para descobrirmos o que está acontecendo:

function obtemPacienteDoFormulario(form){

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }
    console.log(paciente)
    return paciente;
}

Talvez seja no html então, pois eu não alterei nada lá.

Object {nome: "Niko", peso: "90", altura: "1.80", gordura: "15", imc: "27.78"}
form.js:81 Uncaught TypeError: Cannot read property 'peso' of undefined
    at validaPaciente (form.js:81)
    at validaPaciente (form.js:83)
    at validaPaciente (form.js:83)
    at HTMLButtonElement.<anonymous> (form.js:10)
var botaoAdicionar = document.querySelector("#adicionar-paciente");
botaoAdicionar.addEventListener("click", function(event) {
    event.preventDefault();

    var form = document.querySelector("#form-add");
    var paciente = obtemPacienteDoFormulario(form);

    var pacienteTr = montaTr(paciente);

    var errosPaciente = validaPaciente(paciente);


    if(errosPaciente.length > 0){
        exibeMensagensDeErro(errosPaciente);
        return;
    }

    // adiciona paciente na tabela
    var tabela = document.querySelector("#tabela-pacientes");

    tabela.appendChild(pacienteTr);

    form.reset();

});

function exibeMensagensDeErro(errosPaciente){
    var ul = document.querySelector("#mensagens-erro");
    errosPaciente.forEach(function(erro){
        var li = document.createElement("li");
        li.textContent = erro;
        ul.appendChild(li);
    })
}

function obtemPacienteDoFormulario(form){

    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value, form.altura.value)
    }
    console.log(paciente)
    return paciente;
}

function montaTr(paciente){

    var pacienteTr = document.createElement("tr");

    pacienteTr.classList.add("paciente");

    // \/ jeito não recomendado
    var nomeTd = document.createElement("td");
    nomeTd.classList.add("info-nome");
    nomeTd.textContent = paciente.nome;
    // --- 

    pacienteTr.appendChild(nomeTd);
    pacienteTr.appendChild(montaTd(paciente.peso, "info-peso"));
    pacienteTr.appendChild(montaTd(paciente.altura, "info-altura"));
    pacienteTr.appendChild(montaTd(paciente.gordura, "info-gordura"));
    pacienteTr.appendChild(montaTd(paciente.imc, "info-imc"));

    return pacienteTr
}

function montaTd(dado,classe){
    var td = document.createElement("td");
    td.textContent = dado;
    td.classList.add(classe);

    return td;
}

function validaPaciente(paciente){
    var erros = [];

    if(!validaPeso(paciente.peso)) erros.push("Peso inválido");

    if(!validaPaciente(paciente.altura)) erros.push("Altura inválida");


}

O Erro "HTMLbuttom" é referente a : var errosPaciente = ValidaPaciente(paciente);

No começo do código.

solução!

Oi Nikolai,

Baixei seu código e achei alguns erros:

Na sua função validaPaciente , você está dentro dela fazendo uma chamada recursiva para a própria validaPaciente:

function validaPaciente(paciente){
    var erros = [];

    if(!validaPeso(paciente.peso)) erros.push("Peso inválido");
//Erro abaixo
    if(!validaPaciente(paciente.altura)) erros.push("Altura inválida");

}

Acho o que você queria ali era chamar a função validaAltura né ?

function validaPaciente(paciente){
    var erros = [];

    if(!validaPeso(paciente.peso)) erros.push("Peso inválido");
//Corrigido
    if(!validaAltura(paciente.altura)) erros.push("Altura inválida");

}

Outra coisa, não esqueça de retorna o array de erros ao final da validaPaciente:

function validaPaciente(paciente){
    var erros = [];

    if(!validaPeso(paciente.peso)) erros.push("Peso inválido");

    if(!validaAltura(paciente.altura)) erros.push("Altura inválida");
// Retornando erros.
return erros;
}

Faça essa alteração e veja se foi resolvido.

Realmente foi um erro de digitação no "!validaAltura", meu deus... e eu procurando erro de código kkkkkkkkkk.

Obrigado Douglas e foi mal hahah.