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

Como usar o express-validator na edição do form

Estou enfrentando um problema com o express validator, no cadastro vai de boa, mas na hora de editar em que o submit aponta para a rota app.post('/usuario/put/', function(req, res){});, me retorna erro. Eu fiz umas alterações no código, mas mesmo assim ele renderiza a página, mas a url fica apontando para o action do form, segue o código abaixo:

    req.assert('nome', 'O campo nome é obrigatório.').notEmpty();
        req.assert('login', 'O campo login é obrigatório.').notEmpty();
        req.assert('login', 'O campo login deve ter de 5 a 20 caractéres.').len(5, 20);
        req.assert('email', 'O campo e-mail é obrigatório.').notEmpty();
        req.assert('email', 'Formato inválido.').isEmail();

        var erros = req.validationErrors();
        if(erros){ //se houver erro
        //query para pegar os dados do usuário para repopular os campos
            usuarioDAO.getEdit(usuario["id"], function(err, results){
                //res.redirect('/usuario/'+usuario["id"]);
                res.render('usuario/edit', {data: results, errosValidacao:erros});
                return;
            });
        }

Agradeço desde já!

3 respostas

Oi Flávio, está certo.

A invocação do render não altera o endereço que fica no navegador, já que não provoca um redirect no client :). Como o erro é de validação, faz sentido usar um render inclusive com o status 400 :).

Então, no meu ta alterando da url de edição, no caso "usuario/1", por exemplo, para a url que está no action do form que aponta para "usuario/put" de method post, ele renderiza os erros mas quando clico pra salvar novamente me reporta um erro que me faz reiniciar o nodemon.

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
    at ServerResponse.header (/home/flavio/node/apostila_virtual/node_modules/express/lib/response.js:719:10)
    at ServerResponse.location (/home/flavio/node/apostila_virtual/node_modules/express/lib/response.js:836:15)
    at ServerResponse.redirect (/home/flavio/node/apostila_virtual/node_modules/express/lib/response.js:874:18)
    at Query._callback (/home/flavio/node/apostila_virtual/app/routes/usuario.js:119:17)
    at Query.Sequence.end (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/protocol/sequences/Sequence.js:85:24)
    at Query._handleFinalResultPacket (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/protocol/sequences/Query.js:144:8)
    at Query.OkPacket (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/protocol/sequences/Query.js:78:10)
    at Protocol._parsePacket (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/protocol/Protocol.js:280:23)
    at Parser.write (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/protocol/Parser.js:74:12)
    at Protocol.write (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/protocol/Protocol.js:39:16)
    at Socket.<anonymous> (/home/flavio/node/apostila_virtual/node_modules/mysql/lib/Connection.js:109:28)
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:153:18)
    at Socket.Readable.push (_stream_readable.js:111:10)
[nodemon] app crashed - waiting for file changes before starting...
solução!

Oi Flavio, coloca o return dentro do if e não no callback.

if(erros){ //se houver erro
        //query para pegar os dados do usuário para repopular os campos
            usuarioDAO.getEdit(usuario["id"], function(err, results){
                //res.redirect('/usuario/'+usuario["id"]);
                res.render('usuario/edit', {data: results, errosValidacao:erros});                
            });

            return;
        }

Você precisa interromper o fluxo caso caia no erro de validação... Deixando o return no callback, o resto da função continua a ser executada.