pliki statyczne z express.js

213

Chcę służyć index.htmli /mediapodkatalog jako pliki statyczne. Plik indeksu powinien być wyświetlany zarówno pod adresem URL, jak /index.htmli pod nim /.

mam

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

ale druga linia najwyraźniej obsługuje całość __dirname, łącznie ze wszystkimi zawartymi w niej plikami (nie tylko index.htmli media), których nie chcę.

Też próbowałem

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

ale dostęp do podstawowego adresu URL /prowadzi następnie do żądania web_server/index.html/index.html(podwójnego index.htmlskładnika), co oczywiście kończy się niepowodzeniem.

Jakieś pomysły?


Nawiasem mówiąc, nie mogłem znaleźć absolutnie żadnej dokumentacji w Express na ten temat ( static()+ jego parametry) ... frustrujące. Link do dokumentu jest również mile widziany.

użytkownik124114
źródło
2
Począwszy od express 4.x, express.static()jest obsługiwany przez serve-staticpakiet oprogramowania pośredniego. dokumentację można znaleźć na stronie npmjs.com/package/serve-static lub github.com/expressjs/serve-static .
Anm
czy ktoś może wyjaśnić, co oznacza „serwer jako pliki statyczne”?
Abhi
@iLiveInAPineappleUnderTheSea W dynamicznej aplikacji internetowej, na przykład podczas korzystania z Express, zawartość strony jest tworzona - lub generowana - przez aplikację. Z drugiej strony pliki statyczne są udostępniane (głównie) niezmodyfikowane ze statycznej hierarchii katalogów. Na przykład, chociaż strony mogą się zmieniać, pliki obrazów, pliki CSS i pliki JavaScript nie zmieniają się.
Philip Callender,
sprawdź poniższy link only4ututorials.blogspot.com/2017/05/…
Dexter

Odpowiedzi:

100

express.static()oczekuje, że pierwszym parametrem będzie ścieżka do katalogu, a nie nazwa pliku. Sugerowałbym utworzenie kolejnego podkatalogu, aby zawierał twój index.htmli używał go.

Udostępnianie plików statycznych w dokumentacji Express lub bardziej szczegółowej serve-staticdokumentacji , w tym domyślne zachowanie podczas udostępnianiaindex.html :

Domyślnie ten moduł wyśle ​​pliki „index.html” w odpowiedzi na żądanie w katalogu. Aby wyłączyć ten zestaw false lub podać nowy indeks, przekaż ciąg znaków lub tablicę w preferowanej kolejności.

abe
źródło
6
I tylko dla informacji, domyślnie będzie obsługiwał index.html w tym innym katalogu
TheSteve0
Jeśli jest tylko JEDEN parametr - wówczas express.staticoczekuje, że ten jeden parametr będzie ścieżką ....
Seti
188

Jeśli masz tę konfigurację

/app
   /public/index.html
   /media

To powinno dostać to, czego chciałeś

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

Sztuką jest pozostawienie tej linii jako ostatniej rezerwy

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

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

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

250R
źródło
15
Application.configure()został udokumentowany jako starsza wersja w wersji 3.x i usunięty w wersji 4.x. Zobacz odpowiedź ChrisaCantrella na zaktualizowany przykład.
Anm
Dzięki, to bardzo pomogło
mdegges
co to jest __dirname? Jaka jest jego wartość?
Abhi
1
nieaktualne dla najnowszego ekspresu.
John Heeter
133

W najnowszej wersji ekspresu „createServer” jest przestarzały. 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');
ChrisCantrell
źródło
__dirname jest słowem kluczowym?
Mohammad Faizan khan
6
Jest globalny w twoim module nodejs. nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell
7
__dirname nie jest w rzeczywistości globalny, ale raczej lokalny dla każdego modułu.
Mohammad Faizan khan
2
jest to odpowiednik pytona, __file__którego używasz zos.path.dirname(os.path.realpath(__file__))
Abdelouahab
@ChrisCantrell Jak mogę dodać do folderu statycznego, jeśli mam plik public/teams/logo.png?
Michał
37

res.sendFilei express.staticoba będą na to działać

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

Gdzie publicjest folder, w którym znajduje się kod po stronie klienta

Jak sugerowano przez @ATOzTOA i wyjaśnione przez @Vozzie , path.joinbierze ścieżki dołączyć jako argumentów +przechodzi jeden argument na ścieżce.

Mohammed Zameer
źródło
2
path.joinprzyjmuje ścieżki do przyłączenia jako argumenty, +przekazuje pojedynczy argument do ścieżki.
ATOzTOA
@ATOzTOA, czy możesz wyjaśnić więcej, proszę
Mohammed Zameer
@ ATOzTOA mówi, że powinieneś zmienić się path.join(public + 'index.html')w path.join(public, 'index.html')A kiedy już to zmienisz __dirname + "/public/"napath.join(__dirname, 'public')
Vozzie
Pomogło mi to w połączeniu strony statycznej z interfejsem API w jednym
Jeff Beagley
4
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')
})
rajmobiapp
źródło
2

npm install install-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 );
})
Rejayi CS
źródło
2

użyj poniżej w pliku app.js

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

(folderName to folder zawierający pliki) - pamiętaj, że dostęp do tych zasobów można uzyskać bezpośrednio przez ścieżkę serwera (tj. http: // localhost: 3000 / abc.png (gdzie jak abc.png znajduje się w folderze folderName)

Pravin
źródło