2012-05-03 36 views
153

chcę służyć index.html i /media podkatalogu postaci plików statycznych. Plik indeksu powinien być wyświetlany zarówno pod adresami /index.html, jak i /.statyczne pliki z express.js

mam

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

ale druga linia najwyraźniej służy całą __dirname, w tym wszystkich plików w nim (nie tylko index.html i media), którego nie chcę.

Próbowałem też

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

ale dostępu bazowy URL / następnie prowadzi do wniosku o web_server/index.html/index.html (podwójne index.html Component), co oczywiście nie powiedzie się.

Wszelkie pomysły?


Przy okazji udało mi się znaleźć żadnego dokumentację Express na ten temat (static() + jego params) ... frustrujące. Również link do dokumentu jest mile widziany.

+1

Po wyrażeniu 4.x, 'express.static()' jest obsługiwane przez pakiet oprogramowania "serve-static". możesz znaleźć jego dokumenty na https://www.npmjs.com/package/serve-static lub https://github.com/expressjs/serve-static. – Anm

+0

Czy ktoś może wyjaśnić, co oznacza "serwer jako pliki statyczne"? – Abhi

+0

@iLiveInAPineappleUnderTheSea W dynamicznej aplikacji internetowej, takiej jak podczas korzystania z Express, zawartość strony jest tworzona - lub generowana - przez aplikację. Z drugiej strony pliki statyczne są obsługiwane (w większości) niezmodyfikowane ze statycznej hierarchii katalogów. Na przykład, podczas gdy strony mogą się zmieniać, pliki obrazów, pliki CSS i pliki JavaScript nie. –

Odpowiedz

66

express.static() oczekuje, że pierwszym parametrem będzie ścieżka , a nie nazwa pliku. Sugerowałbym utworzenie kolejnego podkatalogu, który zawierałby twój index.html i używał tego.

serwowania plików statycznych Ekspresowe documentation.

+2

I tylko dla informacji, będzie domyślnie wyświetlał index.html w tym drugim katalogu – TheSteve0

+0

Jeśli jest tylko JEDEN parametr - wtedy 'express.static' oczekuje, że jeden parametr będzie ścieżką .... – Seti

158

Jeśli masz tę konfigurację

/app 
    /public/index.html 
    /media 

Następnie powinno to dostać to, czego chciał

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); 

Sztuczka opuszcza ten wiersz jako ostatni awaryjnej

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

chodzi o dokumentację, Ponieważ Express korzysta z oprogramowania pośredniego, łatwiej było po prostu spojrzeć bezpośrednio na kod źródłowy Connect.

Na przykład ten pokazuje, że linia jest obsługiwana index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

+7

' Application.configure() 'zostało udokumentowane jako starsze w 3.x i usunięte w 4. x. Zobacz odpowiedź ChrisCantrell na zaktualizowany przykład. – Anm

+0

Dzięki, pomogło to dużo – mdegges

+0

co to jest "__dirname"? Jaka jest jego wartość? – Abhi

102

W najnowszej wersji wyrażenia „createServer” jest przestarzała.Ten przykład działa dla mnie:

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'); 
+0

__nazwa jest słowem kluczowym? –

+5

Jest to moduł globalny w swoim module nodejs. http://nodejs.org/docs/latest/api/globals.html#globals_dirname – ChrisCantrell

+7

__nazwa nie jest w rzeczywistości globalna, ale raczej lokalna dla każdego modułu. –

12

res.sendFile & express.static oba będą działać w tym

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var public = __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); 

Gdzie public to folder, w którym kod po stronie klienta jest

0

npm zainstalować serve- indeks

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); 
}) 
Powiązane problemy