2
respostas

Uncaught Error: Can't set headers after they are sent.

cadastro de novo produto com dados validos:

Uncaught Error: Can't set headers after they are sent.

acredito que estou com o código correto, mas esse res.redirect('/produtos'); após cadastrar os produtos esta me acusando esse erro.. o que fazer?

module.exports = function(app){

      app.get('/produtos',function(req,res){
      var connection = app.infra.connectionFactory();
      var produtosDAO = new app.infra.ProdutosDAO(connection);
      produtosDAO.lista(function(erros,resultados){
          res.format({
              html: function(){
                  res.render('produtos/lista',{lista:resultados});
              },
              json: function(){
                  res.json(resultados)
              }
          });

      });
      connection.end();
    });


    app.get('/produtos/form',function(req,res){
        res.render('produtos/form',{errosValidacao:{}, produto:{}});
    });

    app.post('/produtos',function(req,res){

        var produto = req.body;

        req.assert('titulo','Titulo é obrigatório').notEmpty();
        req.assert('preco','Formato inválido').isFloat();
        var erros = req.validationErrors();

        if(erros){
          res.format({
               html: function(){
                  res.status(400).render('produtos/form',{errosValidacao:erros, produto:produto});
               },
               json: function(){
                  res.status(400).json(erros);
               }
          });
        }


        var connection = app.infra.connectionFactory();
        var produtosDAO = new app.infra.ProdutosDAO(connection);
        produtosDAO.salva(produto, function(erros,resultados){
             res.redirect('/produtos');
        });
    });
}
2 respostas

Maurício, tudo bem? Acho difícil ser exatamente essa linha. Cola a mensagem de erro completa pra gente ver o que pode ser de fato?

Esse if de erros me parece estranho ele também fazer o render dentro de um format.

Se a suspeita é a rota /produtos (POST), então talvez o problema esteja no tratamento de erros, pois o tratamento de erros e o redirect utilizam o "res".

Talvez esteja ocorrendo um erro, colocando um return depois de tratar o erro talvez isso deixe de ocorrer. Exemplo:

app.post('/pages/create', function(req, res) {
  req.checkBody("leader_email", "Enter a valid email address.").isEmail();

  var errors = req.validationErrors();
  if (errors) {
    res.send(errors);
    return;
  } else {
    // normal processing here
  }
});

Esse exemplo veio desta página

https://booker.codes/input-validation-in-express-with-express-validator/

Aqui tem um link com uma discussão sobre esse tipo de erro:

https://stackoverflow.com/questions/7042340/error-cant-set-headers-after-they-are-sent-to-the-client