Konfigurowanie dwóch różnych statycznych katalogów w środowisku node.js Express

101

Czy to możliwe? Chciałbym ustawić dwa różne katalogi do obsługi plików statycznych. Powiedzmy / public i / mnt

sNiCKY
źródło
2
Ta strona wydaje się mówić, że jest to możliwe, ale nie zawiera bardziej szczegółowych informacji.
por

Odpowiedzi:

152

Możesz również ustawić ścieżkę, z której pliki statyczne będą dostarczane do sieci, określając dodatkowy (pierwszy) parametr, aby use():

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

W ten sposób otrzymujesz dwa różne katalogi w sieci WWW, które odzwierciedlają katalogi lokalne, a nie jedną ścieżkę URL, która przełącza się awaryjnie między dwoma lokalnymi katalogami.

Innymi słowy, wzorzec adresu URL:

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

Obsługuje pliki z katalogu lokalnego, publicpodczas gdy:

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

Obsługuje pliki z katalogu lokalnego public2.

BTW jest to również przydatne, jeśli nie chcesz, aby statyczne pliki były obsługiwane z katalogu głównego twojego serwera, ale raczej z bardziej kwalifikowanej ścieżki.

HTH

licznik facetów
źródło
1
Idealny @facetcounter! Właśnie wskazałem skrypt do mojego katalogu! script (src = "/ public2 / alertTest.js")
Cody
Jeśli używasz Reacta i próbujesz obsługiwać dwie oddzielne aplikacje, musisz dodać "homepage": "/public"i "homepage": "/public2"do pliku package.json odpowiedniej aplikacji. Aby uzyskać więcej informacji na temat korzystania z dwóch aplikacji React, zobacz moją odpowiedź tutaj stackoverflow.com/a/48569896/4746648
Danny Harding
jest to bardzo przydatne, szczególnie gdy chcesz mieć sharedfolder, aby móc używać "./"i "./shared"bum, możesz łatwo udostępniać pliki js: 3 Dziękuję
Jaacko Torus
55

Możesz także „scalić” katalogi w jeden widoczny katalog

Struktura katalogów

  • /static
  • /alternate_static

Kod

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

Zarówno static, jak i alternate_static będą obsługiwane tak, jakby znajdowały się w tym samym katalogu. Uważaj jednak na łamacze nazw plików.

Randolpho
źródło
6
Jeśli dobrze rozumiem, konflikty nazw plików nie występują, ponieważ węzeł używa pierwszej wersji znalezionego pliku. Jeśli widzi main.jsw static/nim nie będzie nadal szukać w alternate_static/.
RobW
2
To wciąż kłopot, jeśli spodziewasz się, że plik alternate_staticzostanie kiedykolwiek doręczony.
Randolpho
41

Nie jest to możliwe przez jedno wstrzyknięcie oprogramowania pośredniego, ale można wstrzyknąć staticoprogramowanie pośrednie wiele razy:

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

Wyjaśnienie

Spójrz na connect / lib / middleware / static.js # 143 :

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

Istnieje options.rootstatyczny root, który definiujesz express.staticlub connect.staticwywołujesz, i pathjest to ścieżka żądania.

Więcej informacji na temat 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);

Ścieżka sprawdzana tylko raz, a jeśli nie znaleziono pliku, żądanie jest przekazywane do następnego oprogramowania pośredniego.

Aktualizacja dla Connect 2.x

Linki do kodu są nieaktualne dla Connect 2.x, ale użycie wielu statycznych programów pośrednich jest nadal możliwe, jak poprzednio.

Phillip Kovalev
źródło
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
Ajay Ruhela
źródło