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

Formato no retorno de erros

Quando utilizamos o Express Validator,

        const erros = req.validationErrors(); // Retorna os erros.
        if(erros) {
            resp.render('produtos/form',{ erros });
            return;
        }

Essa variável erros é retornada como um JSON certo? Por exemplo, se tivermos dois erros (preço e título por exemplo) vai retornar um array de objetos com as props param, msg, etc...

Na view form.ejs, eu pensei em fazer algo como:

            <% if(erros) { %>
                <ul>
                    <% erros.forEach(function(erro){%>
                        <li>
                            <%= erro.param %> - <%= erro.msg %>
                        </li>
                    <%});%>
                </ul>
            <%}%>

Porém ele não funciona. Resolvi ver o typeof do erros no console.log e recebi um object. Aí fiquei na dúvida sobre como funciona o JSON.

1º: Isso não é uma estrutura de objetos Javascript?

[ 
{ location: 'body',
    param: 'titulo',
    msg: 'Título é necessário',
    value: '' } ]
[ { location: 'body',
    param: 'titulo',
    msg: 'Título é necessário',
    value: '' },
  { location: 'body',
    param: 'preco',
    msg: 'Formato inválido',
    value: 'x' } 
]

2º: Isso sim é uma estrutura JSON, certo?

[ { "location": "body",
    "param": "titulo",
    "msg": "Título é necessário",
    "value": '' },
  { "location": "body",
    "param": "preco",
    "msg": "Formato inválido",
    "value": "x" } ]

Se a estrutura Nº1 é uma estrutura JS, por que eu não consigo acessar a função?

erros.forEach(function(erros){

});
3 respostas

Oi Leonardo, tudo bom?

Os 3 são arrays com objetos dentro. Acredito que o problema seja o nome que você deu pra variavel injetada no foreach:

erros.forEach(function(erro){

});

O nome dado deve ser diferente do nome da coleção (ou de qualquer outra variavel nesse escopo).

Segue JSFiddle de exemplo:

https://jsfiddle.net/grua4q7p/

Abraço!

André... eu tentei mudar os nomes porém ainda assim eu não consegui fazer dessa forma com o forEach(). Vou deixar o for normal mesmo. Mas eu queria entender a questão do JSON que citei acima. Se o que escrevi acima esta certo?

solução!

Oi Leonardo, da uma olhada no link do fiddle, lá tem um exemplo funcionando com foreach em cima do mesmo array.

Quanto ao JSON, se você der uma olhada o array é uma instancia de Array:

container.append(typeof erros) // devolve Object
container.append(erros instanceof Array) // devolve true

Por isso você vê Object com o typeof (já que, realmente ele é uma instância de array) e true ao verificar se a instancia é do tipo Array =)

Agora a estrutura:

var json = { location: 'body',
    param: 'titulo',
    msg: 'Título é necessário',
    value: '' }

É apenas um objeto mesmo. Mais especificamente um objeto anônimo.

Então no seu caso, temos um array com varios objetos dentro sendo o array um objeto também, mas do tipo Array.

ficou mais claro?

abraço