Se eu fizer uma
res.sendfile('public/index1.html');
então recebo um aviso do console do servidor
expresso obsoleto
res.sendfile
: use emres.sendFile
vez disso
mas funciona bem no lado do cliente.
Mas quando eu mudo para
res.sendFile('public/index1.html');
Eu recebo um erro
TypeError: o caminho deve ser absoluto ou especificar raiz para
res.sendFile
e index1.html
não é renderizado.
Eu sou incapaz de descobrir qual é o caminho absoluto. Eu tenho public
diretório no mesmo nível que server.js
. Eu estou fazendo o res.sendFile
de com server.js
. Eu também declareiapp.use(express.static(path.join(__dirname, 'public')));
Adicionando minha estrutura de diretórios:
/Users/sj/test/
....app/
........models/
....public/
........index1.html
Qual é o caminho absoluto a ser especificado aqui?
Estou usando o Express 4.x.
express.static
middleware para servir seu diretório público, por que você precisares.sendFile
enviarpublic/index1.html
?res.sendFile
de dentroapp.get('/', function(req, res){res.sendFile("...")})
para enviá-lo sob demanda.Respostas:
O
express.static
middleware é separadores.sendFile
, portanto, inicializá-lo com um caminho absoluto para opublic
diretório não fará nadares.sendFile
. Você precisa usar um caminho absoluto diretamente comres.sendFile
. Existem duas maneiras simples de fazer isso:res.sendFile(path.join(__dirname, '../public', 'index1.html'));
res.sendFile('index1.html', { root: path.join(__dirname, '../public') });
Nota:
__dirname
retorna o diretório em que o script atualmente em execução está. No seu caso, parece queserver.js
está dentroapp/
. Então, para chegarpublic
, você vai precisar voltar a um nível em primeiro lugar:../public/index1.html
.Nota:
path
é um módulo interno que precisa serrequire
d para que o código acima funcione:var path = require('path');
fonte
res.sendFile('../public/index.html', {root: __dirname});
também funciona e é menorconsole.log(path.join(__dirname, '../public', 'index.html'));
, masres.sendFile(path.join(__dirname, '../public', 'index.html'));
o trabalho apenas comvar path = require('path');
res.sendFile('../public/index.html', {root: __dirname});
não funciona (mais), pois retorna 403 Proibido devido a ir acima da raiz. Faça emres.sendFile('public/index.html', {root: path.dirname(__dirname)});
vez disso.Apenas tente isso:
Isso funcionou para mim. a raiz: __ dirname pegará o endereço em que server.js está no exemplo acima e, em seguida, para chegar ao index1.html (nesse caso), o caminho retornado será o diretório onde está a pasta pública.
fonte
onde
__dirname
gerenciará o nome do diretório em que o script atualmente em execução (server.js
) reside.fonte
path
torna independente do sistema operacional.Uma alternativa que ainda não foi listada e que funcionou para mim é simplesmente usar
path.resolve
com strings separadas ou apenas uma com todo o caminho:Ou
(Nó v6.10.0)
Idéia originada de https://stackoverflow.com/a/14594282/6189078
fonte
Com base nas outras respostas, este é um exemplo simples de como cumprir o requisito mais comum:
Isso também funciona como uma maneira simples de responder com index.html em todas as solicitações , porque estou usando uma estrela
*
para capturar todos os arquivos que não foram encontrados no diretório estático (público); qual é o caso de uso mais comum para aplicativos da web. Mude para/
para retornar o índice apenas no caminho raiz.fonte
Eu tentei isso e funcionou.
fonte
process.cwd()
retorna o caminho absoluto do seu projeto.Então :
fonte
Outra maneira de fazer isso escrevendo menos código.
fonte
você pode usar send em vez de sendFile para não enfrentar erros! isso funciona irá ajudá-lo!
por informar ao navegador que sua resposta é do tipo PDF
se você deseja que o arquivo seja aberto imediatamente na mesma página após o usuário fazer o download. escreva 'inline' em vez do anexo no código acima.
fonte
Se você deseja configurar isso uma vez e usá-lo em qualquer lugar, basta configurar seu próprio middleware. Ao configurar seu aplicativo, use o seguinte para definir uma nova função no objeto de resposta:
Em seguida, use-o da seguinte maneira:
fonte
Eu uso o Node.Js e tive o mesmo problema ... Resolvi adicionando um '/' no início de cada script e link para um arquivo estático css.
Antes:
Depois de:
fonte