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

para que serve o return no if?

Olá, na aula 5 do curso "Node.js: Inovando com Javascript no backend", a atividade pede para implementarmos o res.format().

Eu fiz da seguinte maneira:

app.post('/produtos', function(req, res){
    var produto = req.body;

    req.assert('titulo', 'Título é obrigatório').notEmpty();
    req.assert('preco', 'Formato inválido').isFloat();

    var erros = req.validationErrors();

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

    var connection = app.infra.connectionFactory();
    var ProdutosDAO = new app.infra.ProdutosDAO(connection);

    ProdutosDAO.salva(produto, function(err, resultados){
      if(err) {
        res.redirect('/produtos');
      }
      res.format({
        html: function(){
          res.send(produto);
        },
        json: function(){
          res.json(produto);
        }
      });
    });
  });

Pra gerar as requisições no formato JSON, eu uso o app POSTMAN. Quando eu removo o return da primeira sentença if, se forem enviadas mais de duas requisições POST seguidas com os campos titulo e preco inválidos, eu ainda consigo cadastrar, mesmo com campos inválidos. Se eu deixo o return no primeiro if, isso não acontece. Não consegui entender o motivo. Alguém ajuda?

2 respostas

Fala Ícaro, tudo bem ?

Então .. o if na verdade é necessário pra encerrar a execução da sua request. Perceba que neste ponto você está validando se existe alguma erro nos parâmetros de entrada. Se houver, você monta uma resposta informando sobre o erro (status 400, bad request, tentativa de requisição processada com dados inválidos) e usa o return pra encerrar ali, impedindo assim que o código prossiga e vocÊ cadastre um produto inválido.

Espero ter ajudado. Abraço!

solução!

Entendi, mas eu lendo a documentação do express e fazendo alguns testes simples notei que o objeto res encerra o ciclo de solicitação - resposta. Nesse caso, o res.render() não deveria encerrar esse ciclo, ou seja, não deveria sair da função de middleware para app.post() no caminho /produtos?

[EDIT] Fazendo novos testes, percebi que ao usar res.render() ou res.send() em conjunto com um if , o código posterior ainda é executado, como no exemplo:

app.get('/', function(req, res, next){
  res.send('Legal');
  console.log('Ainda executa');
});

Achei que qualquer método do objeto res finalizava o ciclo.