Configurazione di due diverse directory statiche nel framework node.js Express


Risposte:


152

È inoltre possibile impostare il percorso da cui verranno pubblicati i file statici sul Web specificando un (primo) parametro aggiuntivo in questo use()modo:

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

In questo modo si ottengono due directory diverse sul Web che rispecchiano le directory locali, non un percorso URL che esegue il failover tra due directory locali.

In altre parole, il pattern URL:

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

Fornisce file dalla directory locale publicmentre:

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

Fornisce file dalla directory locale public2.

A proposito, questo è anche utile se non vuoi che static serva i file dalla radice del tuo server ma piuttosto da un percorso più qualificato.

HTH


1
Perfetto @facetcounter! Ho appena indicato uno script nella mia directory! script (src = "/ public2 / alertTest.js")
Cody,

Se si utilizza React e si cerca di servire due app separate, è necessario aggiungere "homepage": "/public"e "homepage": "/public2"al package.json della rispettiva app react. Per maggiori informazioni sull'utilizzo di due app di reazione, vedere la mia risposta qui stackoverflow.com/a/48569896/4746648
Danny Harding

questo è molto utile specialmente quando si desidera una sharedcartella in modo che è possibile utilizzare "./"e "./shared"e boma si può facilmente js di condivisione file: 3 Thank You
Jaacko Torus

55

Puoi anche "unire" directory in un'unica directory visibile

Struttura delle directory

  • /static
  • /alternate_static

Codice

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

Sia static che alternate_static verranno serviti come se fossero nella stessa directory. Attenzione però ai clobbers dei nomi dei file.


6
Se capisco correttamente, i conflitti di nome file non si verificano perché il nodo utilizza la prima versione del file che trova. Se vede main.jsdentro static/, non continuerà a guardare dentro alternate_static/.
RobW

2
È ancora un disastro se ti aspettavi che il file alternate_staticvenisse mai servito.
Randolpho

41

Non è possibile tramite un'iniezione di middleware, ma puoi iniettare il staticmiddleware più volte:

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

Spiegazione

Guarda connect / lib / middleware / static.js # 143 :

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

C'è options.rootuna radice statica, che definisci express.statico connect.staticchiami, ed pathè il percorso della richiesta.

Guarda di più su 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);

Il percorso è stato verificato solo una volta e, se il file non è stato trovato, la richiesta è passata al middleware successivo.

Aggiornamento per Connect 2.x

I collegamenti al codice non sono effettivi per Connect 2.x, ma è ancora possibile utilizzare più middleware statico come prima.


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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.