caminho absoluto res.sendFile

Se eu fizer um

res.sendfile('public/index1.html'); 

então eu recebo um aviso do console do servidor

res.sendfile depreciado: use res.sendFile

mas funciona bem no lado do cliente.

Mas quando eu mudo para

 res.sendFile('public/index1.html'); 

Eu recebo um erro

TypeError: path deve ser absoluto ou especificar root para res.sendFile

e index1.html não é processado.

Eu não consigo descobrir qual é o caminho absoluto. Eu tenho public diretório public no mesmo nível que o server.js . Eu estou fazendo o res.sendFile de com server.js . Eu também declarei app.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.

O middleware express.static é separado de res.sendFile , portanto, inicializá-lo com um caminho absoluto para seu diretório public não fará nada para res.sendFile . Você precisa usar um caminho absoluto diretamente com res.sendFile . Existem duas maneiras simples de fazer isso:

  1. res.sendFile(path.join(__dirname, '../public', 'index1.html'));
  2. res.sendFile('index1.html', { root: path.join(__dirname, '../public') });

Nota: __dirname retorna o diretório no qual o script atualmente em execução está. No seu caso, parece que server.js está em app/ . Então, para chegar ao public , você precisará voltar um nível primeiro: ../public/index1.html .

Nota: path é um módulo embutido que precisa ser require d para o código acima funcionar: var path = require('path');

Apenas tente isso:

 res.sendFile('public/index1.html' , { root : __dirname}); 

Isso funcionou para mim. a raiz: __ dirname pegará o endereço onde server.js está no exemplo acima e, em seguida, para obter o index1.html (neste caso) o caminho retornado é para chegar ao diretório onde está a pasta pública.

 res.sendFile( __dirname + "/public/" + "index1.html" ); 

onde __dirname irá gerenciar o nome do diretório em que reside o script atualmente em execução ( server.js ).

Uma alternativa que ainda não foi listada e que funcionou para mim é simplesmente usar path.resolve com strings separadas ou apenas uma com o caminho inteiro:

 // comma separated app.get('/', function(req, res) { res.sendFile( path.resolve('src', 'app', 'index.html') ); }); 

Ou

 // just one string with the path app.get('/', function(req, res) { res.sendFile( path.resolve('src/app/index.html') ); }); 

(Nó v6.10.0)

Idéia originada de https://stackoverflow.com/a/14594282/6189078

Outra maneira de fazer isso, escrevendo menos código.

 app.use(express.static('public')); app.get('/', function(req, res) { res.sendFile('index.html'); }); 

Eu tentei isso e funcionou.

 app.get('/', function (req, res) { res.sendFile('public/index.html', { root: __dirname }); }); 

process.cwd() retorna o caminho absoluto do seu projeto.

Então :

 res.sendFile( `${process.cwd()}/public/index1.html` ); 

Se você quiser configurá-lo uma vez e usá-lo em todos os lugares, basta configurar seu próprio middleware. Quando você estiver configurando seu aplicativo, use o seguinte para definir uma nova function no object de resposta:

 app.use((req, res, next) => { res.show = (name) => { res.sendFile(`/public/${name}`, {root: __dirname}); }; next(); }); 

Em seguida, use-o da seguinte maneira:

 app.get('/demo', (req, res) => { res.show("index1.html"); }); 

Com base nas outras respostas, este é um exemplo simples de como realizar o requisito mais comum:

 const app = express() app.use(express.static('public')) // relative path of client-side code app.get('*', function(req, res) { res.sendFile('index.html', { root: __dirname }) }) app.listen(process.env.PORT) 

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 em seu diretório estático (público); que é o caso de uso mais comum para aplicativos da web. Altere para / para retornar o índice apenas no caminho da raiz.