Configuración de dos directorios estáticos diferentes en el framework node.js Express

101

¿Es posible? Me gustaría configurar dos directorios diferentes para servir archivos estáticos. Digamos / public y / mnt

sNiCKY
fuente
2
Esta página parece decir que es posible pero no entra en muchos más detalles que eso.
puerro

Respuestas:

152

También puede establecer la ruta desde la que se enviarán los archivos estáticos a la web especificando un (primer) parámetro adicional para use()que así:

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

De esa manera, obtiene dos directorios diferentes en la web que reflejan sus directorios locales, no una ruta de URL que falla entre dos directorios locales.

En otras palabras, el patrón de URL:

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

Sirve archivos del directorio local publicmientras:

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

Sirve archivos del directorio local public2.

Por cierto, esto también es útil si no desea que la estática sirva los archivos desde la raíz de su servidor, sino desde una ruta más calificada.

HTH

facetcounter
fuente
1
Perfecto @facetcounter! ¡Acabo de apuntar un script a mi directorio! script (src = "/ public2 / alertTest.js")
Cody
Si usa React e intenta servir dos aplicaciones separadas, debe agregar "homepage": "/public"y "homepage": "/public2"al paquete.json de la aplicación de reacción respectiva. Para obtener más información sobre el uso de dos aplicaciones de reacción, consulte mi respuesta aquí stackoverflow.com/a/48569896/4746648
Danny Harding
esto es muy útil especialmente cuando desea una sharedcarpeta para poder usar "./"y "./shared"y boom, puede compartir fácilmente archivos js: 3 Gracias
Jaacko Torus
55

También puede "fusionar" directorios en un solo directorio visible

Estructura de directorios

  • /static
  • /alternate_static

Código

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

Tanto static como alternate_static se servirán como si estuvieran en el mismo directorio. Sin embargo, tenga cuidado con los nombres de archivo.

Randolpho
fuente
6
Si entiendo correctamente, los conflictos de nombre de archivo no ocurren porque el nodo usa la primera versión del archivo que encuentra. Si ve main.jsadentro static/, no continuará mirando adentro alternate_static/.
RobW
2
Eso sigue siendo una paliza si esperaba que el archivo se alternate_staticentregara alguna vez.
Randolpho
41

No es posible mediante una inyección de middleware, pero puede inyectar staticmiddleware varias veces:

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

Explicación

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

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

Hay una options.rootraíz estática, que define express.statico connect.staticllama, y pathuna ruta de solicitud.

Mire más en 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);

La ruta se verificó solo una vez y, si el archivo no se encontró, la solicitud pasó al siguiente middleware.

Actualización para Connect 2.x

Los enlaces al código no son actuales para Connect 2.x, pero el uso de middleware estático múltiple sigue siendo posible como antes.

Phillip Kovalev
fuente
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
fuente