Einrichten von zwei verschiedenen statischen Verzeichnissen im Express-Framework von node.js.


100

Ist es möglich? Ich möchte zwei verschiedene Verzeichnisse einrichten, um statische Dateien bereitzustellen. Sagen wir / public und / mnt


2
Diese Seite scheint zu sagen, dass es möglich ist, geht aber nicht viel detaillierter darauf ein.
Lauch

Antworten:


151

Sie können auch den Pfad festlegen, über den statische Dateien für das Web bereitgestellt werden, indem Sie einen zusätzlichen (ersten) Parameter angeben, der use()wie folgt aussieht :

app.use("/public", express.static(__dirname + "/public"));
app.use("/public2", express.static(__dirname + "/public2"));

Auf diese Weise erhalten Sie zwei verschiedene Verzeichnisse im Web, die Ihre lokalen Verzeichnisse widerspiegeln, und nicht einen URL-Pfad, der zwischen zwei lokalen Verzeichnissen ausfällt.

Mit anderen Worten das URL-Muster:

http://your.server.com/public/*

Serviert Dateien aus dem lokalen Verzeichnis, publicwährend:

http://your.server.com/public2/*

Serviert Dateien aus dem lokalen Verzeichnis public2.

Übrigens ist dies auch nützlich, wenn Sie nicht möchten, dass statische Dateien die Dateien vom Stammverzeichnis Ihres Servers aus bereitstellen, sondern von einem qualifizierteren Pfad.

HTH


1
Perfekt @facetcounter! Ich habe gerade ein Skript auf mein Verzeichnis verwiesen! Skript (src = "/ public2 / alertTest.js")
Cody

Bei der Verwendung von React und zu versuchen , dienen zwei separate Anwendungen, müssen Sie hinzufügen "homepage": "/public"und "homepage": "/public2"auf den jeweiligen reagiert App package.json. Weitere Informationen zur Verwendung von zwei Reaktions-Apps finden Sie in meiner Antwort hier stackoverflow.com/a/48569896/4746648
Danny Harding

Dies ist besonders dann sehr nützlich, wenn Sie einen sharedOrdner benötigen, damit Sie js-Dateien problemlos verwenden "./"und "./shared"boomen können: 3 Vielen Dank
Jaacko Torus

54

Sie können Verzeichnisse auch in einem einzigen sichtbaren Verzeichnis "zusammenführen"

Verzeichnisaufbau

  • /static
  • /alternate_static

Code

app.use("/static", express.static(__dirname + "/static"));
app.use("/static", express.static(__dirname + "/alternate_static"));

Sowohl static als auch alternative_static werden so bereitgestellt, als ob sie sich im selben Verzeichnis befinden. Achten Sie jedoch auf Dateinamen-Clobber.


6
Wenn ich das richtig verstehe, treten keine Dateinamenkonflikte auf, da der Knoten die erste Version der gefundenen Datei verwendet. Wenn sie sieht main.jsin static/ihm nicht suchen in weiter alternate_static/.
RobW

2
Das ist immer noch ein Problem, wenn Sie damit gerechnet haben, dass die Datei alternate_staticjemals zugestellt wird .
Randolpho

41

Es ist nicht durch eine Middleware-Injektion möglich, aber Sie können staticMiddleware mehrmals injizieren :

app.configure('development', function(){
    app.use(express.static(__dirname + '/public1'));
    app.use(express.static(__dirname + '/public2'));
});

Erläuterung

Schauen Sie sich connect / lib / middleware / static.js # 143 an :

path = normalize(join(root, path));

Es gibt options.rooteine statische Wurzel, die Sie definieren express.staticoder connect.staticaufrufen, und einen pathAnforderungspfad.

Weitere Informationen finden Sie unter connect / lib / middleware / static.js # 154 :

  fs.stat(path, function(err, stat){
    // ignore ENOENT
    if (err) {
      if (fn) return fn(err);
     return ('ENOENT' == err.code || 'ENAMETOOLONG' == err.code)
       ? next()
       : next(err);

Der Pfad wurde nur einmal überprüft, und wenn die Datei nicht gefunden wurde, wurde die Anforderung an die nächste Middleware weitergeleitet.

Update für Connect 2.x.

Links zu Code sind für Connect 2.x inaktiv, aber die Verwendung mehrerer statischer Middleware ist nach wie vor möglich.


0
const express = require('express');
const path = require('path');
const pagesPath = path.join(__dirname, '/cheatsheet');
const cssPath = path.join(__dirname, '/stylesheet');
const port = process.env.PORT || 3000;

var app = express();

app.use("/cheatsheet" ,express.static(pagesPath));
app.use("/stylesheet",express.static(cssPath)); 

app.get('/',(request,response)=>{
    response.send('Hello CSS!!!');
  });

app.get('/bad',(request,response)=>{
response.send({error: 'Bad Request'});

});
app.listen(port, ()=> {
console.log(`Server is running on Port ${port}` );
console.log(__dirname);

});

// folder structure
/cheatsheet/index.html
/stylesheet/style.css
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.