Express-js no puede OBTENER mis archivos estáticos, ¿por qué?

308

Reduje mi código a la aplicación express-js más simple que pude hacer:

var express = require("express"),
    app = express.createServer();
app.use(express.static(__dirname + '/styles'));
app.listen(3001);

Mi directorio se ve así:

static_file.js
/styles
  default.css

Sin embargo, cuando accedo http://localhost:3001/styles/default.cssme sale el siguiente error:

Cannot GET / styles /
default.css

Estoy usando express 2.3.3y node 0.4.7. ¿Qué estoy haciendo mal?

Kit Sunde
fuente
consulte el siguiente enlace only4ututorials.blogspot.com/2017/05/…
Dexter

Respuestas:

492

Tratar http://localhost:3001/default.css.

Para tener /stylesen su URL de solicitud, use:

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

Mira los ejemplos en esta página :

//Serve static content for the app from the "public" directory in the application directory.

    // GET /style.css etc
    app.use(express.static(__dirname + '/public'));

// Mount the middleware at "/static" to serve static content only when their request path is prefixed with "/static".

    // GET /static/style.css etc.
    app.use('/static', express.static(__dirname + '/public'));
Giacomo
fuente
42
Gracias. Como alguien nuevo en Node and Express, la documentación de Express parece incompleta hasta que descubres que Connect es donde están los documentos de middleware.
Nate
44
Sí. Fue el corte faltante en mi caso.
borisdiakur
En mi caso, no me di cuenta de que la ruta de montaje estaba incluida en la ruta como explicaste en el segundo ejemplo. ¡Gracias!
Mike Cheel
En caso de una nueva instalación, debe verificar que su módulo express esté instalado correctamente ( expressjs.com/en/starter/installing.html ), luego debe verificar la ruta y el nombre de su directorio como dijo Giacomo;)
Spl2nky
siempre se utiliza path.joinpara superar los problemas de separador de directorio multiplataforma. path.join (__ dirname, '/')
Doug Chamberlain el
35

Tengo el mismo problema. He resuelto el problema con el siguiente código:

app.use('/img',express.static(path.join(__dirname, 'public/images')));
app.use('/js',express.static(path.join(__dirname, 'public/javascripts')));
app.use('/css',express.static(path.join(__dirname, 'public/stylesheets')));

Ejemplo de solicitud estática:

http://pruebaexpress.lite.c9.io/js/socket.io.js

Necesito una solución más simple. ¿Existe?

David Miró
fuente
Gracias por compartir su solución, independientemente de si es óptima o no. Si desea volver a abrir el problema para la optimización, considere publicar una nueva pregunta que detalle las nuevas circunstancias. Si la optimización es el único propósito, la pregunta puede ser más adecuada para SO Code Review .
15

default.css debería estar disponible en http://localhost:3001/default.css

El stylesde app.use(express.static(__dirname + '/styles'));simplemente expresar dice que buscar en el stylesdirectorio para un archivo estático para servir. No lo hace (confusamente) entonces forma parte de la ruta en la que está disponible.

diff_sky
fuente
3
¡Totalmente! Que es por convención en express.js lo haces en /publicla que tiene css, js, imgcarpetas para que pueda http://localhost:3001/css/default.css:)
Kit Sunde
15

Este trabajo para mi:

app.use('*/css',express.static('public/css'));
app.use('*/js',express.static('public/js'));
app.use('*/images',express.static('public/images'));
usuario3418903
fuente
9

En su server.js:

var express   =     require("express");
var app       =     express();
app.use(express.static(__dirname + '/public'));

Has declarado express y app por separado, crea una carpeta llamada 'public' o como quieras, y aún así puedes acceder a esta carpeta. En su plantilla src, ha agregado la ruta relativa desde / public (o el nombre del destino de su carpeta a los archivos estáticos). Cuidado con los bares en las rutas.

Baurin Leza
fuente
6

Lo que funcionó para mí es:

En lugar de escribir app.use(express.static(__dirname + 'public/images'));en tu app.js

Simplemente escribe app.use(express.static('public/images'));

es decir, elimine el nombre del directorio raíz en la ruta. Y luego puede usar la ruta estática de manera efectiva en otros archivos js, por ejemplo:

<img src="/images/misc/background.jpg">

Espero que esto ayude :)

Amir Aslam
fuente
Esto resolvió mi problema. En mi código, la ruta a CSS funcionaba bien incluso con la concatenación __dirname (usando path.join), mientras que recuperar js fallaba.
Chim
Me alegra que haya ayudado :)
Amir Aslam
5

Estoy usando Bootstrap CSS, JS y Fonts en mi aplicación. Creé una carpeta llamada asseten el directorio raíz de la aplicación y coloco todas estas carpetas dentro de ella. Luego, en el archivo del servidor, agregue la siguiente línea:

app.use("/asset",express.static("asset"));

Esta línea me permite cargar los archivos que están en el assetdirectorio desde el /assetprefijo de ruta como:http://localhost:3000/asset/css/bootstrap.min.css .

Ahora en las vistas simplemente puedo incluir CSS y JS como a continuación:

<link href="/asset/css/bootstrap.min.css" rel="stylesheet">
arsho
fuente
5

para servir archivos estáticos (css, imágenes, archivos js) solo dos pasos:

  1. pasar el directorio de archivos css a middleware express.static integrado

    var express = require('express');
    var app = express();
    /*public is folder in my project directory contains three folders
    css,image,js
    */
    //css  =>folder contains css file
    //image=>folder contains images
    //js   =>folder contains javascript files
    app.use(express.static( 'public/css'));
  2. para acceder a archivos css o imágenes simplemente escriba url http: // localhost: port / filename.css ex: http: // localhost: 8081 / bootstrap.css

nota: para vincular archivos CSS a HTML simplemente escriba<link href="file_name.css" rel="stylesheet">

si escribo este código

var express = require('express');
var app = express();
app.use('/css',express.static( 'public/css'));

para acceder a los archivos estáticos simplemente escriba url: localhost: port / css / filename.css ej: http: // localhost: 8081 / css / bootstrap.css

Nota para vincular archivos CSS con HTML simplemente agregue la siguiente línea

<link href="css/file_name.css" rel="stylesheet">    
Ahmed Mahmoud
fuente
3

este me funcionó

app.use(express.static(path.join(__dirname, 'public')));

app.use('/img',express.static(path.join(__dirname, 'public/images')));

app.use('/shopping-cart/javascripts',express.static(path.join(__dirname, 'public/javascripts')));

app.use('/shopping-cart/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/stylesheets',express.static(path.join(__dirname, 'public/stylesheets')));

app.use('/user/javascripts',express.static(path.join(__dirname, 'public/javascripts')));
james gicharu
fuente
1

Encuentro mi archivo css y le agrego una ruta:

app.get('/css/MyCSS.css', function(req, res){
  res.sendFile(__dirname + '/public/css/MyCSS.css');
});

Entonces parece funcionar.

Bren
fuente
No recomendaría este enfoque, ya que debería usar ExpressJS .use()y express.static()métodos para enviar donde está sirviendo sus archivos. De lo contrario, tendrá uno de estos enrutadores por archivo en su directorio público y eso es una gran carga para mantener.
Sgnl
Esta es una solución, pero no creo que sea apropiado. Si tiene muchos archivos CSS y JS, ¿cómo puede mantenerlo?
arsho
0

Además de lo anterior, asegúrese de que la ruta del archivo estático comience con / (ex ... / assets / css) ... para servir archivos estáticos en cualquier directorio sobre el directorio principal (/ main)

bigskier91
fuente
2
Además de lo anterior? Indícalo en tu respuesta (si es necesario, dale crédito a la persona que lo publicó). SO a menudo cambia el orden de las respuestas para que todas las respuestas se vean y no las primeras. No sabemos de qué estás hablando.
Zachary Kniebel
0

si su configuración

myApp
  |
  |__ public
  |     |
  |     |__  stylesheets
  |     |     |
  |     |     |__ style.css
  |     |
  |     |___ img
  |           |
  |           |__ logo.png
  |
  |__ app.js

luego,
ingrese app.js

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

y consulte su style.css: (en algún archivo .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')
Bar Horing
fuente
¿Por qué introducirías un paso de cambio de nombre público -> estático? Yo diría que es información adicional más confusa. Pero, de nuevo, la indirección suele ser algo bueno ...
masterxilo
0
  1. Crear una carpeta con nombre 'público' en el proyecto Nodejs
    carpeta del .
  2. Coloque el archivo index.html en la carpeta del proyecto Nodejs.
  3. Ponga todo el script y el archivo CSS en la carpeta pública.
  4. Utilizar app.use( express.static('public'));

  5. y en index.html la ruta correcta de scripts para<script type="text/javascript" src="/javasrc/example.js"></script>

Y ahora todas las cosas funcionan bien.

Hossein Mourdzadeh
fuente
0

directorio estático

verifique la imagen anterior (directorio estático) para ver la estructura de directorios

const publicDirectoryPath = path.join(__dirname,'../public')
app.use(express.static(publicDirectoryPath))


//  or

app.use("/", express.static(publicDirectoryPath))
app.use((req, res, next) => {
res.sendFile(path.join(publicDirectoryPath,'index.html'))
holaJT
fuente