Problema:
Enviei a minha aplicação pra Umbler, os logs parecem ser da minha aplicação, mas quando eu tento acessar dá que o site não foi publicado!
Primeiramente, de onde vem essa página?
Na Umbler, assim que você cria um site NodeJS, nós colocamos uma aplicação bem simples nossa que disponibiliza uma página HTML que contém a mensagem de “Site não publicado”
Essa é a estrutura de arquivos (importante para depois):
Tá mas, e quando eu envio a minha aplicação?
Quando chega nessa etapa, os seus arquivos serão copiados para a pasta da sua aplicação. Os arquivos com o mesmo nome e caminho serão substituídos.
Então se você enviar uma aplicação com essa estrutura, por exemplo:
O resultado final será esse:
Note que:
No programa que foi enviado, a index.html (página principal) está dentro da pasta public, logo, não substituiu a index.html da aplicação padrão que fica no “root” da aplicação. Então há duas index.html em caminhos diferentes.
Isso não é pra causar problemas, pois idealmente a aplicação que foi enviada vai apenas ignorar a index.html que permaneceu.
Mas em alguns casos, pode dar problema sim
Por exemplo, se você tiver um middleware da função static do express apontando para o “root” da aplicação.
Tipo assim:
Ou assim:
O que esse middleware faz?
Esse middleware disponibiliza os arquivos para serem acessados externamente pela URL, o argumento dele é a pasta de origem desses arquivos.
__dirname
e "."
se referem a pasta root da aplicação, a que contém o package.json, o .js da sua aplicação e etc.
Antes de tudo, isso é perigosíssimo
Se você estiver disponibilizando os arquivos do root da sua aplicação, então é possível acessar todos os arquivos dela. Inclusive o código fonte.
Se alguém digitar na URL seusitenodejs.com/package.json ou seusitenodejs.com/app.js ou qualquer outro caminho, esses arquivos serão acessados. Podendo expor o seu código fonte, possíveis senhas de banco de dados etc etc etc.
Mas voltando, porque mostra a mensagem de site não publicado?
Porque quando o middleware static é chamado, se não houver nenhum arquivo especificado, ele por padrão procura por um index.html. Se ele não achar, ele desiste e passa para o próximo middleware (por isso que a aplicação funciona localmente). Mas quando a aplicação está na Umbler, irá permanecer o index.html com a mensagem de site não publicado, e o middleware vai disponibilizar esse arquivo. Sem dar chance para os próximos middlewares disponibilizarem os arquivos realmente importantes do seu site.
Como resolver isso então?
Simples, removendo a linha que disponibiliza o root da aplicação. Além de causar esse problema com o index.html, é um gigante problema de segurança