archivos estáticos con express.js

Quiero servir index.html y /media subdirectorio como archivos estáticos. El archivo de índice debe servirse tanto en /index.html y / URL.

He

web_server.use("/media", express.static(__dirname + '/media'));
web_server.use("/", express.static(__dirname));

pero la segunda línea aparentemente sirve a todo el __dirname, incluidos todos los archivos que contiene (no solo index.html y media), que no quiero.

También probé

web_server.use("/", express.static(__dirname + '/index.html'));

pero accediendo a la URL base / luego conduce a una solicitud de web_server/index.html/index.html (Doble index.html componente), que por supuesto falla.

¿Alguna idea?


Por cierto, no pude encontrar absolutamente ninguna documentación en Express sobre este tema (static() + sus parámetros)... frustrante. Un enlace doc también es bienvenido.

preguntado el 03 de mayo de 12 a las 15:05

A partir de express 4.x, express.static() es manejado por serve-static paquete de software intermedio. puede encontrar sus documentos en npmjs.com/package/serve-static or github.com/expressjs/servir-estático. -

¿Puede alguien explicar qué significa "servidor como archivos estáticos"? -

@iLiveInAPineappleUnderTheSea En una aplicación web dinámica, como cuando se usa Express, la aplicación crea o genera el contenido de la página. Por otro lado, los archivos estáticos se sirven (en su mayoría) sin modificar desde una jerarquía de directorios estáticos. Por ejemplo, si bien las páginas pueden cambiar, los archivos de imagen, los archivos CSS y los archivos Javascript no lo hacen. -

comprobar el enlace a continuación only4ututorials.blogspot.com/2017/05/… -

Aquí hice un video para un propósito similar. Utiliza express y serve-index para crear una solución completa para compartir archivos a través de la LAN. youtu.be/4S6doMsaT78 -

10 Respuestas

Si tienes esta configuración

/app
   /public/index.html
   /media

Entonces esto debería obtener lo que querías

var express = require('express');
//var server = express.createServer();
// express.createServer()  is deprecated. 
var server = express(); // better instead
server.configure(function(){
  server.use('/media', express.static(__dirname + '/media'));
  server.use(express.static(__dirname + '/public'));
});

server.listen(3000);

El truco es dejar esta línea como último recurso.

  server.use(express.static(__dirname + '/public'));

En cuanto a la documentación, dado que Express usa el middleware de conexión, me resultó más fácil mirar directamente el código fuente de conexión.

Por ejemplo, esta línea muestra que index.html es compatible https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

Respondido el 10 de junio de 14 a las 07:06

Application.configure() se documentó como heredado en 3.x y se eliminó en 4.x. Consulte la respuesta de ChrisCantrell para ver un ejemplo actualizado. - ANM

Gracias, esto ayudó mucho - grados

¿cuál es la __dirname? ¿Cuál es su valor? - Abhi

desactualizado para el último expreso. - Juan Heeter

En la versión más reciente de express, "createServer" está en desuso. Este ejemplo funciona para mí:

var express = require('express');
var app = express();
var path = require('path');

//app.use(express.static(__dirname)); // Current directory is root
app.use(express.static(path.join(__dirname, 'public'))); //  "public" off of current is root

app.listen(80);
console.log('Listening on port 80');

contestado el 13 de mayo de 13 a las 15:05

__dirname es la palabra clave? - Mohammad Faizan Khan

__dirname no es en realidad global sino local para cada módulo. - Mohammad Faizan Khan

este es el equivalente en python de __file__ que usas con os.path.dirname(os.path.realpath(__file__)) - Abdelouahab

@ChrisCantrell ¿Cómo puedo agregar a una carpeta estática si tengo un archivo en public/teams/logo.png ? - michal

express.static() espera que el primer parámetro sea un camino de un directorio, no un nombre de archivo. Sugeriría crear otro subdirectorio para contener su index.html y usa eso.

Sirviendo archivos estáticos en Express documentación o el más detallado serve-static documentación, incluyendo la comportamiento predeterminado de servir index.html:

De forma predeterminada, este módulo enviará archivos "index.html" en respuesta a una solicitud en un directorio. Para deshabilitar este conjunto falso o proporcionar un nuevo índice, pase una cadena o una matriz en el orden preferido.

Respondido 17 Abr '19, 20:04

Y solo como información, servirá index.html de forma predeterminada en ese otro directorio: elSteve0

Si solo hay UN parámetro, entonces express.static espera que un parámetro sea la ruta.... - Seti

res.sendFile & express.static ambos funcionarán para esto

var express = require('express');
var app = express();
var path = require('path');
var public = path.join(__dirname, 'public');

// viewed at http://localhost:8080
app.get('/', function(req, res) {
    res.sendFile(path.join(public, 'index.html'));
});

app.use('/', express.static(public));

app.listen(8080);

Dónde public es la carpeta en la que se encuentra el código del lado del cliente

As sugiere by @ATOzTOA y aclarado por @Vozzie, path.join toma los caminos para unir como argumentos, el + pasa un único argumento a ruta.

contestado el 01 de mayo de 18 a las 08:05

path.join toma los caminos para unir como argumentos, el + pasa un único argumento a ruta. - ATOzTOA

@ATOzTOA, ¿puede explicar más, por favor? xameeramir

Lo que dice @ATOzTOA es que deberías cambiar path.join(public + 'index.html') dentro path.join(public, 'index.html') Y de paso, cambia __dirname + "/public/" dentro path.join(__dirname, 'public') - Vozzie

Esto me ayudó a combinar un sitio estático con una API, todo en uno: jeff beagley

const path = require('path');

const express = require('express');

const app = new express();
app.use(express.static('/media'));

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'media/page/', 'index.html'));
});

app.listen(4000, () => {
    console.log('App listening on port 4000')
})

Respondido 02 Abr '19, 06:04

Si tiene una estructura de carpetas complicada, como

- application
     - assets
         - images
             - profile.jpg
     - web
     - server
        - index.js

Si quieres servir assets/images hasta index.js

app.use('/images', express.static(path.join(__dirname, '..', 'assets', 'images')))

Para ver desde su navegador

http://localhost:4000/images/profile.jpg

Si necesita más aclaración, comente, lo elaboraré.

Respondido 18 Oct 21, 03:10

¡La mejor respuesta del lote! - sabana madison

npm instalar índice de servicio

var express    = require('express')
var serveIndex = require('serve-index')
var path = require('path')
var serveStatic = require('serve-static')
var app = express()
var port = process.env.PORT || 3000;
/**for files */
app.use(serveStatic(path.join(__dirname, 'public')));
/**for directory */
app.use('/', express.static('public'), serveIndex('public', {'icons': true}))

// Listen
app.listen(port,  function () {
  console.log('listening on port:',+ port );
})

Respondido 02 Oct 17, 20:10

use a continuación dentro de su app.js

app.use(express.static('folderName'));

(folderName es una carpeta que tiene archivos): recuerde que se accede a estos activos directamente a través de la ruta del servidor (es decir, http://localhost:3000/abc.png (donde como abc.png está dentro de la carpeta folderName)

Respondido el 11 de enero de 19 a las 18:01

Agregaría algo que está en el documentos exprés, y a veces se lee mal en tutoriales u otros.

app.use(mountpoint, middleware) 

punto de montaje es una ruta virtual, no está en el sistema de archivos (incluso si realmente existe). El punto de montaje para el middleware es el app.js carpeta.

Actuales

app.use('/static', express.static('public')`

enviará archivos con la ruta /static/hell/meow/a.js a /public/hell/meow/a.js

Respondido 11 Jul 21, 11:07

Este es el error en mi caso cuando proporciono enlaces a archivos HTML.

antes:

<link rel="stylesheet" href="/es/public/style.css">

Después:

<link rel="stylesheet" href="/es/style.css">

Acabo de eliminar la ruta del directorio estático del enlace y el error desapareció. Esto resuelve mi error una cosa más, no olvides poner esta línea donde estás creando el servidor.

var path = require('path');
app.use(serveStatic(path.join(__dirname, 'public')));

Respondido 28 ago 21, 01:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.