res.sendFile percorso assoluto


137

Se lo faccio a

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

quindi ricevo un avviso sulla console del server

espresso deprecato res.sendfile: utilizzare res.sendFileinvece

ma funziona bene sul lato client.

Ma quando lo cambio a

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

Ho ricevuto un errore

TypeError: il percorso deve essere assoluto o specificare root su res.sendFile

e index1.htmlnon è reso.

Non riesco a capire quale sia il percorso assoluto. Ho publicdirectory allo stesso livello di server.js. Sto facendo il res.sendFilecon server.js. Ho anche dichiaratoapp.use(express.static(path.join(__dirname, 'public')));

Aggiunta della mia struttura di directory:

/Users/sj/test/
....app/
........models/
....public/
........index1.html

Qual è il percorso assoluto da specificare qui?

Sto usando Express 4.x.


Se si utilizza il express.staticmiddleware per servire la propria directory pubblica, perché è necessario res.sendFileinviare public/index1.html?
Mike S,

1
Sto chiamando res.sendFiledall'interno app.get('/', function(req, res){res.sendFile("...")})per inviarlo su richiesta.
Kaya Toast,

Risposte:


311

Il express.staticmiddleware è separato da res.sendFile, quindi inizializzarlo con un percorso assoluto per la publicdirectory non farà nulla per res.sendFile. È necessario utilizzare un percorso assoluto direttamente con res.sendFile. Esistono due modi semplici per farlo:

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

Nota: __dirname restituisce la directory in cui si trova lo script attualmente in esecuzione. Nel tuo caso, sembra che server.jssia in app/. Così, per raggiungere public, avrete bisogno di nuovo fuori di un livello prima: ../public/index1.html.

Nota: pathè un modulo integrato che deve essere required affinché il codice sopra funzioni:var path = require('path');


14
res.sendFile('../public/index.html', {root: __dirname});funziona anche ed è più breve
Fabien Sa

Lavorare con express e webstorm ide: non ci sono errori console.log(path.join(__dirname, '../public', 'index.html'));ma res.sendFile(path.join(__dirname, '../public', 'index.html'));funziona solo con var path = require('path');
Quake1TF

Non c'è modo di pre-definire il percorso assoluto in modo che possa essere utilizzato in sendFile?
eran otzap,

4
res.sendFile('../public/index.html', {root: __dirname});non funziona (più), poiché restituisce 403 Proibito a causa del superamento della radice. Fare res.sendFile('public/index.html', {root: path.dirname(__dirname)});invece.
Trevor Robinson,

48

Basta provare questo invece:

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

Questo ha funzionato per me. root: __ dirname prenderà l'indirizzo in cui server.js è nell'esempio sopra e quindi per raggiungere index1.html (in questo caso) il percorso restituito è raggiungere la directory in cui si trova la cartella pubblica.


Perché questa opzione non è documentata?
timkay,

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

dove __dirnamegestirà il nome della directory in cui server.jsrisiede lo script attualmente in esecuzione ( ).


Questa soluzione è stata abbastanza semplice Grazie per l'aiuto .. Mi chiedo perché le persone raccomandino di usare il pacchetto 'path' per fare lo stesso.
Il terzo

3
@TheThird immagino che l'uso lo pathrende indipendente dal sistema operativo .
kmonsoor,

7

Un'alternativa che non è stata ancora elencata e che ha funzionato per me è semplicemente usare path.resolvecon stringhe separate o solo una con l'intero percorso:

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

O

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

(Nodo v6.10.0)

Idea proveniente da https://stackoverflow.com/a/14594282/6189078


6

Sulla base delle altre risposte, questo è un semplice esempio di come soddisfare il requisito più comune:

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)

Questo funge anche da modo semplice per rispondere con index.html ad ogni richiesta , perché sto usando una stella *per catturare tutti i file che non sono stati trovati nella tua directory statica (pubblica); che è il caso d'uso più comune per le app Web. Passare a /per restituire l'indice solo nel percorso principale.


Bello. Bello e succinto.
Lharby,

5

Ho provato questo e ha funzionato.

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

4

process.cwd() restituisce il percorso assoluto del tuo progetto.

Poi :

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

3

Un altro modo per farlo scrivendo meno codice.

app.use(express.static('public'));

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

5
Questo genera "TypeError: il percorso deve essere assoluto o specificare root per res.sendFile"
GreenAsJade

1

puoi usare send invece di sendFile in modo da non dover affrontare errori! questo funziona ti aiuterà!

fs.readFile('public/index1.html',(err,data)=>{
if(err){
  consol.log(err);
}else {
res.setHeader('Content-Type', 'application/pdf');

per dire al browser che la tua risposta è un tipo di PDF

res.setHeader('Content-Disposition', 'attachment; filename='your_file_name_for_client.pdf');

se vuoi che quel file si apra immediatamente sulla stessa pagina dopo che l'utente lo ha scaricato, scrivi 'inline' invece allegato nel codice sopra.

res.send(data)

0

Se si desidera configurarlo una volta e utilizzarlo ovunque, è sufficiente configurare il proprio middleware. Quando si configura l'app, utilizzare quanto segue per definire una nuova funzione sull'oggetto risposta:

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

Quindi usalo come segue:

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

0

Uso Node.Js e ho avuto lo stesso problema ... Ho risolto solo l'aggiunta di un '/' all'inizio di ogni script e il collegamento a un file statico CSS.

Prima:

<link rel="stylesheet" href="assets/css/bootstrap/bootstrap.min.css">

Dopo:

<link rel="stylesheet" href="/assets/css/bootstrap/bootstrap.min.css">

Dovresti configurare il server statico espresso per farlo funzionare
Hum4n01d
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.