2
respostas

Express-validator não valida array?

Após concluir o curso eu tive um peque grande problema.

A validação do expresse-validator é perfeita quando se passa apenas um objeto na requisição. Quando se passa um array é preciso varrer o array para validar os atributos de cada objeto. O problema está exatamente aqui.

Meu código ficou assim:

usuarios.map((u) => {
        req.assert('u.email', 'E-mail undefined').notEmpty();
        req.assert('u.senha', 'Senha undefined').notEmpty();
        req.assert('u.nome', 'Nome é obrigatório').notEmpty();

        var erros = req.validationErrors();
        if (erros) {
            res.status(500).send(erros);
            return;
        }

        if (u.senha) u.senha = sha512(u.senha);
    });

    model.collection.insert(usuarios, {senha: 0})
        .then((resultado) => {
            res.status(200).json(resultado);
        }, (error) => {
            console.log(error);
            res.status(500).json(error);
        });

Quando faço a requisição ocorre a exceção:

(node:21252) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: u is not defined
(node:21252) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Perdi um dia pesquisando e tentando entender o problema sem sucesso! Alguém teve algum problema parecido?

2 respostas

Oi Hugo, tudo bem? O problema que está acontecendo é o seguinte: Você recebe o Array e faz um map dos objetos, certo? Mas depois você verifica esses objetos direto na requisição, quando na verdade, estão dentro de um array dentro da requisição, por isso está recebendo um undefined.

Eu não sei se o express-validator pode receber um indice de array pra validar, mas caso aceite, uma possível solução poderia ser:

usuarios.map((u, i) => {
    req.assert(`${usuarios[i].email}`, 'E-mail undefined').notEmpty();
    req.assert(`${usuarios[i].senha}`, 'Senha undefined').notEmpty();
    req.assert(`${usuarios[i].nome}`, 'Nome é obrigatório').notEmpty();

    var erros = req.validationErrors();
    if (erros) {
        res.status(500).send(erros);
        return;
    }

    if (usuarios[i].senha) usuarios[i].senha = sha512(u.senha);
});

Se bem que acho que você não precisa usar o map necessariamente, poderia ser um foreach.

Aqui tem uma outra forma de tentar fazer esta validação:

https://stackoverflow.com/questions/37339479/express-validator-to-validate-paramenter-which-is-an-array