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

App NodeJS + Handlebars no heroku

Pessoal, sou bastante novo em programação, fiz o curso de NodeJS com REST API e então decidi entender como Back-End e Front-End se conectavam .... vendo alguns tutoriais desenvolvi um CRUD utilizando Handlebars e tentei subir no Heroku.

A aplicação está funcionando, quando eu testo POST e GET com o Postman está tudo ok . Porém, quando eu tento acessar alguma página que criei recebo a mensagem abaixo

 {"erro":{"mensagem":"ENOENT: no such file or directory, open '/app/views/layouts/Main.handlebars'"}}

O detalhe é que quando eu testo na minha maquina, roda tudo normal ...

minha estrutura de pastas local está da seguinte forma:

estrutura

Esse é meu App.js onde eu já tentei alterar os diretorios das seguintes formas, sem sucesso

             app.engine('handlebars', hdbars({extname: "handlebars",defaultLayout: "Main", layoutsDir: "./views/layouts", }));
             app.engine('handlebars', hdbars({extname: "handlebars",defaultLayout: "Main", layoutsDir: "/views/layouts", }));
             app.engine('handlebars', hdbars({extname: "handlebars",defaultLayout: "Main", layoutsDir: "layouts", }));
             app.engine('handlebars', hdbars({extname: "handlebars",defaultLayout: "Main", layoutsDir: "/layouts", }));
            const express=require('express');
            const app = express();
            const morgan = require('morgan');
            const bodyParser = require('body-parser')



            app.use('/css',express.static('css'));


            const hdbars = require('express-handlebars');
            //app.engine('handlebars',hdbars  ({defaultLayout:'Main'}));
            app.engine('handlebars', hdbars({extname: "handlebars",defaultLayout: "Main", layoutsDir: "./views/layouts", }));


            app.set('view engine','handlebars');

            const rotaProdutos = require('./routes/produtos');
            const rotaPedidos = require('./routes/pedidos');
            const rotaUsuarios = require('./routes/usuarios');

            app.use(morgan('dev'));//EXTENSAO QUE DA RESPOSTAS DE GET E POST
            app.use('/uploads',express.static('uploads'))
            app.use(bodyParser.urlencoded({extended: false}));
            app.use(bodyParser.json());

            app.use((req, res, next) => {
                res.header('Access-Control-Allow-Origin', '*');
                res.header(
                    'Access-Control-Allow-Headers', 
                    'Origin, X-Requested-With, Content-Type, Accept, Authorization'
                );

                if (req.method==='OPTIONS'){
                    res.header('Access-Control-Allow-Methods','PUT, POST, PATCH, DELETE, GET, OPTIONS');
                    return res.status(200).send({})
                }

                next();
            })

            app.use('/produtos', rotaProdutos);
            app.use('/pedidos', rotaPedidos);
            app.use('/usuarios', rotaUsuarios);

            app.get("/", (req, res) =>{ 
                //res.send('ROTA DO BasasARRA'); 
                //res.sendFile(__dirname+'/views/index.html')
                return res.render(__dirname+'/views/index');
                //return res.send("você está no barra")

            }) 



            //QUANDO NÃO ENCONTRA A ROTA
            app.use((req, res, next) =>{
                const erro=new Error('Não encontrado');
                erro.status=404;
                next(erro);
            })

            app.use((error, req, res, next) =>{
                res.status(error.status|| 500);
                 return res.send({
                     erro:{
                         mensagem:error.message
                     }
                 });
            });

            module.exports =app

Alguém consegue me ajudar sobre como proceder pra aparecer corretamente o main.handlebars que eu crieiObrigado

6 respostas

Bom dia Lucas, tudo certo?

Eu pesquisei por instâncias de erros similares ao seu e achei essa issue no repositório do express-handlebars.

A solução proposta seria algo do tipo:

app.engine('handlebars', hdbars({
    extname: "handlebars",
    defaultLayout: "Main",
    layoutsDir: path.join(__dirname, 'views/layouts' 
}));

Estou esperando o retorno do seu teste. Caso não obtenha sucesso, poderia compartilhar um repositório com seu projeto no GitHub conosco para investigarmos melhor?

Bons estudos!

João, obrigado mas não funcionou, agora a APP está dando Crash, sinceramente não me recordo se após o post no fórum eu fiz alguma alteração em outra parte do programa.

o projeto no GitHub está no seguinte caminho https://github.com/LucasSardo/rest

mais uma vez obrigado abs

solução!

Talvez a estrutura que seja executada no Heroku seja diferente, tente checar os arquivos que ficam salvos lá pelos painéis de administração.

Mas enquanto investigava o projeto encontrei algumas barreiras antes de conseguir executar localmente o código e reproduzir seu problema, Lucas:

Sinto que o projeto se beneficiaria do pacote npm config para gerenciar as váriáveis de ambiente que você colocou no arquivo nodemon.js, que não é um nome significativo para essa finalidade. Cobrimos esse tópico nessa aula

Quando alguém baixa o projeto, a pessoa também necessitaria do banco de dados para poder executar a API, uma forma mais prática de configurar o ambiente seria criando um script que gera as tabelas no formato que a API requer, como é feito nessa aula.

Outra coisa que notei é que existem vários domínios atrelados no mesmo trecho de código, como: tratamento de erros, conexão, query do banco de dados e informações do request HTTP. Essa estrutura de organização dificulta a manutenção da sua aplicação e deixa todos os pacotes muito acoplados. Além disso, pelo que consegui entender, você está executando o front end junto da API, que vai aumentar ainda mais a complexidade do projeto.

Então eu tenho a seguinte sugestão: confira os cursos na ordem da formação Node.js com express e utilize como base o código de um dos projetos do curso que tenha a quantidade de recursos que te satisfaça para iniciar o seu projeto de API.

Assim que tiver uma API que já tenha testado o suficiente sozinha, você vai poder partir para o lado do front-end muito mais confiante. Faça um outro projeto diferente que consuma essas informações. Também temos disponível aqui na plataforma o curso JS na web: CRUD com JavaScript assíncrono que vai te dar uma base de como consumir essa API.

Espero que essas dicas tenham ajudado, bons estudos!

João, muito obrigado pela explicação detalhada e análise do código. Como disse, estou no começo de tudo ainda .... vou ver cada uma dessas aulas e tentar seguir.

O grande problema para quem começa no back-end é não conseguir "ver" o resultado final mais "palpável" por isso estava tentando fazer essa "conexao" de front e back.

mais uma vez obrigado . grande abraço

Tranquilo Lucas! O seu feedback é muito importante. Essas informações nos ajudam fazer os cursos e funcionalidades que mais podem contribuir com o crescimento dos usuários.

Fica ligado que estão para sair os Challenges, que vão te permitir implementar um projeto similar aos moldes que você mencionou e fazer essas conexões durante o aprendizado.

nossa , sensacional iniciativa. estou no aguardo sempre