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

Falha no retorno das validações para view

Eu já revisei o código e já comparei com o da aula e aparentemente está tudo certo. Porém estou obtendo o seguinte erro quando retorno para view

Error: Failed to lookup view "/produtos/form" in views directory "./app/views"
    at Function.render (D:\Estudos\node\casadocodigo\node_modules\express\lib\application.js:580:17)
    at ServerResponse.render (D:\Estudos\node\casadocodigo\node_modules\express\lib\response.js:966:7)
    at app.post (D:\Estudos\node\casadocodigo\app\routes\produtos.js:33:17)
    at Layer.handle [as handle_request] (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:335:12)
    at next (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:275:10)
    at D:\Estudos\node\casadocodigo\node_modules\express-validator\lib\express_validator.js:355:5
    at Layer.handle [as handle_request] (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:317:13)
    at D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:335:12)
    at next (D:\Estudos\node\casadocodigo\node_modules\express\lib\router\index.js:275:10)

Meu produtos.js

module.exports = (app) => {
    let listaProdutos = (req, res) => {
        let connection = app.infra.connectionFactory();
        let produtosDAO = new app.infra.ProdutosDAO(connection);
        produtosDAO.lista((err, results) => {
            res.format({
                html: () => {
                    res.render('produtos/lista', {lista:results});
                },
                json: () => {
                    res.json(results);
                }
            });

        });
        connection.end();
    } 
    app.get('/produtos', listaProdutos);

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

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

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

        let erros = req.validationErrors();

        if(erros) {
            res.render('/produtos/form', {errosValidacao:erros});
            return;
        }

        let connection = app.infra.connectionFactory();
        let produtosDAO = new app.infra.ProdutosDAO(connection);
        produtosDAO.salva(produto, (err, results) => {
            res.redirect('/produtos');
        });
        connection.end();
    });
};

Minha view form.ejs

<html>
    <body>
        <div class="erros">
            <%if(errosValidacao){%>
                <ul>
                    <%for(var i = 0; i<errosValidacao.length; i++){%>
                        <li><%=errosValidacao[i].param%> - <%=errosValidacao[i].msg%></li>
                    <%}%>
                </ul>
            <%}%>
        </div>
        <form action="/produtos" method="post">
            <div>
                <label for="titulo">Titulo</label>
                <input type="text" id="titulo" name="titulo" placeholder="coloque o titulo"/>
            </div>
            <div>
                <label for="preco">Preço</label>
                <input type="text" id="preco" name="preco" placeholder="150.25"/>
            </div>
            <div>
                <label for="descricao">Descrição</label>
                <textarea cols="20" rows="10" id="descricao" name="descricao" placeholder="fale sobre o livro"></textarea>
            </div>

            <input type="submit" value="gravar"/>
        </form>
    </body>
</html>

Alguém pode me ajudar?

2 respostas
solução!

tenta tirar a primeira / do /produtos/form

Obrigado Alberto! Funcionou ;)