statische Dateien mit express.js

212

Ich möchte als statische Dateien dienen index.htmlund /mediaUnterverzeichnis. Die Indexdatei sollte sowohl unter /index.htmlals auch unter /URLs bereitgestellt werden.

ich habe

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

aber die zweite Zeile dient anscheinend dem gesamten __dirname , einschließlich aller darin enthaltenen Dateien (nicht nur index.htmlund media), was ich nicht will.

Ich habe es auch versucht

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

aber Zugriff auf die Basis-URL / führt dann jedoch zu einer Anforderung an web_server/index.html/index.html(Doppelkomponente index.html), die natürlich fehlschlägt.

Irgendwelche Ideen?


Übrigens konnte ich in Express absolut keine Dokumentation zu diesem Thema finden ( static()+ seine Parameter) ... frustrierend. Ein Doc-Link ist ebenfalls willkommen.

user124114
quelle
2
Ab Express 4.x express.static()wird von serve-staticPaket-Middleware gehandhabt . Sie finden die Dokumente unter npmjs.com/package/serve-static oder github.com/expressjs/serve-static .
Anm
Kann jemand bitte erklären, was "Server als statische Dateien" bedeutet?
Abhi
@iLiveInAPineappleUnderTheSea In einer dynamischen Webanwendung, z. B. bei Verwendung von Express, wird der Seiteninhalt von der Anwendung erstellt oder generiert. Andererseits werden statische Dateien (meistens) unverändert aus einer statischen Verzeichnishierarchie bereitgestellt. Während sich die Seiten möglicherweise ändern, tun dies beispielsweise die Bilddateien, CSS-Dateien und Javascript-Dateien nicht.
Philip Callender
siehe
Dexter

Antworten:

100

express.static()erwartet, dass der erste Parameter ein Pfad eines Verzeichnisses und kein Dateiname ist. Ich würde vorschlagen, ein anderes Unterverzeichnis zu erstellen, das Ihr enthält, index.htmlund dieses zu verwenden.

Bereitstellen statischer Dateien in der Express- Dokumentation oder in einer detaillierteren serve-staticDokumentation , einschließlich des Standardverhaltens beim Bereitstellenindex.html :

Standardmäßig sendet dieses Modul "index.html" -Dateien als Antwort auf eine Anforderung in einem Verzeichnis. Um diese Einstellung auf false zu deaktivieren oder einen neuen Index bereitzustellen, übergeben Sie eine Zeichenfolge oder ein Array in der bevorzugten Reihenfolge.

abe
quelle
6
Und nur zur Information, es wird index.html standardmäßig in diesem anderen Verzeichnis
bereitstellen
Wenn es nur EINEN Parameter gibt - dann express.staticerwartet man, dass ein Parameter Pfad ist ....
Seti
188

Wenn Sie dieses Setup haben

/app
   /public/index.html
   /media

Dann sollte dies bekommen, was Sie wollten

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

Der Trick besteht darin, diese Zeile als letzten Fallback zu verlassen

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

Da Express die Connect-Middleware verwendet, war es für mich einfacher, den Connect-Quellcode direkt anzusehen.

Diese Zeile zeigt beispielsweise, dass index.html https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140 unterstützt wird

250R
quelle
15
Application.configure()wurde in 3.x als Legacy dokumentiert und in 4.x entfernt. Ein aktualisiertes Beispiel finden Sie in der Antwort von ChrisCantrell.
Anm
Vielen Dank, das hat sehr geholfen
mdegges
was ist das __dirname? Was ist ihr Wert?
Abhi
1
veraltet für den neuesten Express.
John Heeter
132

In der neuesten Version von Express ist der "createServer" veraltet. Dieses Beispiel funktioniert für mich:

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
quelle
__dirname ist Schlüsselwort?
Mohammad Faizan Khan
6
Es ist ein Global in Ihrem NodeJS-Modul. nodejs.org/docs/latest/api/globals.html#globals_dirname
ChrisCantrell
7
__dirname ist eigentlich kein globaler, sondern ein lokaler Name für jedes Modul.
Mohammad Faizan Khan
2
Dies ist das Äquivalent in Python, __file__das Sie mitos.path.dirname(os.path.realpath(__file__))
Abdelouahab
@ChrisCantrell Wie kann ich einen statischen Ordner hinzufügen, wenn ich eine Datei in habe public/teams/logo.png?
Michael
37

res.sendFile& express.staticbeide werden dafür arbeiten

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

Wo publicbefindet sich der Ordner, in dem sich der clientseitige Code befindet?

Wie vorgeschlagen von @ATOzTOA und geklärt durch @Vozzie , path.joindie Pfade als Argumente zu verbinden in Anspruch nimmt, +übergibt ein einziges Argument Pfad.

Mohammed Zameer
quelle
2
path.joinNimmt die zu verbindenden Pfade als Argumente und +übergibt ein einzelnes Argument an den Pfad.
ATOzTOA
@ ATOzTOA können Sie bitte mehr erklären
Mohammed Zameer
Was @ATOzTOA sagt, ist, dass Sie sich path.join(public + 'index.html')in path.join(public, 'index.html')Und währenddessen __dirname + "/public/"inpath.join(__dirname, 'public')
Vozzie
Dies half mir bei der Kombination einer statischen Site mit einer API in einem
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
quelle
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 );
})
Rejayi CS
quelle
2

Verwenden Sie unten in Ihrer app.js.

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

(Ordnername ist Ordner mit Dateien) - Denken Sie daran, dass auf diese Assets direkt über den Serverpfad zugegriffen wird (dh http: // localhost: 3000 / abc.png (wobei sich abc.png im Ordnerordner befindet).

Pravin
quelle