file statici con express.js


213

Voglio servire index.htmle /mediasottodirectory come file statici. Il file indice deve essere offerto sia su /index.htmlche sugli /URL.

io ho

web_server.use("/media", express.static(__dirname + '/media'));
web_server.use("/", express.static(__dirname));

ma la seconda riga apparentemente serve l'intero __dirname, compresi tutti i file (non solo index.htmle media), che non voglio.

Ho anche provato

web_server.use("/", express.static(__dirname + '/index.html'));

ma l'accesso all'URL di base /porta quindi a una richiesta web_server/index.html/index.html(doppio index.htmlcomponente), che ovviamente fallisce.

Qualche idea?


A proposito, non ho trovato assolutamente alcuna documentazione in Express su questo argomento ( static()+ i suoi parametri) ... frustrante. Un link doc è anche il benvenuto.


2
A partire da express 4.x, express.static()è gestito dal serve-staticmiddleware del pacchetto. puoi trovare i suoi documenti su npmjs.com/package/serve-static o github.com/expressjs/serve-static .
Anm,

qualcuno può spiegare cosa significa "server come file statici"?
Abhi,

@iLiveInAPineappleUnderTheSea In un'applicazione Web dinamica, ad esempio quando si utilizza Express, il contenuto della pagina viene creato o generato dall'applicazione. D'altra parte, i file statici vengono serviti (principalmente) non modificati da una gerarchia di directory statica. Ad esempio, mentre le pagine possono cambiare, i file di immagine, i file CSS e i file Javascript non lo fanno.
Philip Callender,

Risposte:


100

express.static()si aspetta che il primo parametro sia un percorso di una directory, non un nome file. Suggerirei di creare un'altra sottodirectory per contenere la tua index.htmle usarla.

Serve file statici in veloce documentazione , o più dettagliata serve-staticdocumentazione , compreso il comportamento predefinito di servireindex.html :

Per impostazione predefinita, questo modulo invierà file "index.html" in risposta a una richiesta in una directory. Per disabilitare questo set false o per fornire un nuovo indice, passare una stringa o un array nell'ordine preferito.


6
E solo per informazione, verrà utilizzato index.html per impostazione predefinita in quell'altra directory
TheSteve0

Se c'è solo UN parametro - quindi si express.staticaspetta che un parametro sia percorso ...
Seti

188

Se hai questa configurazione

/app
   /public/index.html
   /media

Quindi questo dovrebbe ottenere quello che volevi

var express = require('express');
//var server = express.createServer();
// express.createServer()  is deprecated. 
var server = express(); // better instead
server.configure(function(){
  server.use('/media', express.static(__dirname + '/media'));
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);

Il trucco sta lasciando questa linea come ultimo fallback

  server.use(express.static(__dirname + '/public'));

Per quanto riguarda la documentazione, poiché Express utilizza il middleware di connessione, ho trovato più semplice esaminare direttamente il codice sorgente di connect.

Ad esempio, questa riga mostra che index.html è supportato https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140


15
Application.configure()è stato documentato come eredità in 3.xe rimosso in 4.x. Vedi la risposta di ChrisCantrell per un esempio aggiornato.
Anm,

Grazie, questo ha aiutato molto
mdegges,

che cos'è il __dirname? Qual è il suo valore?
Abhi,

1
obsoleto per l'ultimo espresso.
John Heeter,

133

Nella versione più recente di express il "createServer" è obsoleto. Questo esempio funziona per me:

var express = require('express');
var app = express();
var path = require('path');

//app.use(express.static(__dirname)); // Current directory is root
app.use(express.static(path.join(__dirname, 'public'))); //  "public" off of current is root

app.listen(80);
console.log('Listening on port 80');

__dirname è la parola chiave?
Mohammad Faizan khan,

6
È un modulo globale nel tuo modulo nodejs. nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell

7
__dirname non è in realtà un globale ma piuttosto locale per ciascun modulo.
Mohammad Faizan khan,

2
questo è l'equivalente in pitone di __file__cui si usaos.path.dirname(os.path.realpath(__file__))
Abdelouahab,

@ChrisCantrell Come posso aggiungere alla cartella statica se ho un file public/teams/logo.png?
michal

37

res.sendFileed express.staticentrambi funzioneranno per questo

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__dirname, 'public');

// viewed at http://localhost:8080
app.get('/', function(req, res) {
    res.sendFile(path.join(public, 'index.html'));
});

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

app.listen(8080);

Dove si publictrova la cartella in cui si trova il codice lato client

Come suggerito da @ATOzTOA e chiarito da @Vozzie , path.joinprende i percorsi da unire come argomenti, +passa un singolo argomento al percorso.


2
path.joinaccetta i percorsi da unire come argomenti, +passa un singolo argomento al percorso.
ATOzTOA,

@ATOzTOA puoi spiegare di più per favore
Mohammed Zameer,

Quello che sta dicendo è @ATOzTOA si dovrebbe cambiare path.join(public + 'index.html')in path.join(public, 'index.html')E mentre a lui, il cambiamento __dirname + "/public/"inpath.join(__dirname, 'public')
Vozzie

Questo mi ha aiutato a combinare un sito statico con un'API tutto in uno
Jeff Beagley il

5
const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})

2

npm install serve-index

var express    = require('express')
var serveIndex = require('serve-index')
var path = require('path')
var serveStatic = require('serve-static')
var app = express()
var port = process.env.PORT || 3000;
/**for files */
app.use(serveStatic(path.join(__dirname, 'public')));
/**for directory */
app.use('/', express.static('public'), serveIndex('public', {'icons': true}))

// Listen
app.listen(port,  function () {
  console.log('listening on port:',+ port );
})

2

usa di seguito in app.js

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

(folderName è una cartella che contiene file) - ricorda che queste risorse sono accessibili direttamente attraverso il percorso del server (es. http: // localhost: 3000 / abc.png (dove come abc.png è nella cartella folderName)

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.