Configuration de deux répertoires statiques différents dans le framework node.js Express

101

C'est possible? Je voudrais mettre en place deux répertoires différents pour servir des fichiers statiques. Disons / public et / mnt

sNiCKY
la source
2
Cette page semble dire que c'est possible mais n'entre pas dans beaucoup plus de détails que cela.
poireau

Réponses:

152

Vous pouvez également définir le chemin d'accès à partir duquel les fichiers statiques seront servis sur le Web en spécifiant un (premier) paramètre supplémentaire use()comme suit:

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

De cette façon, vous obtenez deux répertoires différents sur le Web qui reflètent vos répertoires locaux, et non un chemin d'URL qui bascule entre deux répertoires locaux.

En d'autres termes, le modèle d'URL:

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

Sert les fichiers du répertoire local publicpendant que:

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

Sert les fichiers du répertoire local public2.

BTW, cela est également utile si vous ne voulez pas que statique serve les fichiers à partir de la racine de votre serveur mais plutôt à partir d'un chemin plus qualifié.

HTH

facette
la source
1
Parfait @facetcounter! Je viens de pointer un script vers mon répertoire! script (src = "/ public2 / alertTest.js")
Cody
Si vous utilisez React et essayez de servir deux applications distinctes, vous devez ajouter "homepage": "/public"et "homepage": "/public2"au package.json de l'application react respective. Pour plus d'informations sur l'utilisation de deux applications de réaction, voir ma réponse ici stackoverflow.com/a/48569896/4746648
Danny Harding
c'est très utile surtout quand vous voulez un shareddossier pour que vous puissiez utiliser "./"et "./shared"et boum, vous pouvez facilement partager des fichiers js: 3 Merci
Jaacko Torus
55

Vous pouvez également «fusionner» des répertoires dans un seul répertoire visible

Structure du répertoire

  • /static
  • /alternate_static

Code

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

Static et Alternate_static seront servis comme s'ils étaient dans le même répertoire. Attention aux clobbers de nom de fichier, cependant.

Randolpho
la source
6
Si je comprends bien, les conflits de noms de fichiers ne se produisent pas car le nœud utilise la première version du fichier qu'il trouve. Si elle voit main.jsen static/elle ne continuera pas à regarder dans alternate_static/.
RobW
2
C'est toujours un problème si vous vous attendiez à ce que le fichier alternate_staticsoit un jour servi.
Randolpho
41

Ce n'est pas possible avec une seule injection de middleware, mais vous pouvez injecter staticplusieurs fois un middleware:

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

Explication

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

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

Il existe options.rootune racine statique, que vous définissez express.staticou connect.staticappelez, et un pathchemin de requête.

Regardez plus à 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);

Chemin vérifié une seule fois, et si le fichier est introuvable, la demande est passée au middleware suivant.

Mise à jour pour Connect 2.x

Les liens vers le code sont inactuels pour Connect 2.x, mais plusieurs utilisations de middleware statiques sont toujours possibles comme auparavant.

Phillip Kovalev
la source
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
la source