Express-js ne peut PAS OBTENIR mes fichiers statiques, pourquoi?


308

J'ai réduit mon code à l'application express-js la plus simple que j'ai pu créer:

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

Mon répertoire ressemble à ceci:

static_file.js
/styles
  default.css

Pourtant, lorsque j'accède, http://localhost:3001/styles/default.cssj'obtiens l'erreur suivante:

Cannot GET / styles /
default.css

J'utilise express 2.3.3et node 0.4.7. Qu'est-ce que je fais mal?


Réponses:


492

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

Pour avoir /stylesdans votre URL de demande, utilisez:

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

Regardez les exemples sur cette page :

//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'));

42
Je vous remercie. En tant que débutant dans Node et Express, la documentation Express semble sommaire jusqu'à ce que vous découvriez que Connect est là où se trouvent les documents du middleware.
Nate

4
Oui. C'était la barre oblique manquante dans mon cas.
borisdiakur

Dans mon cas, je ne savais pas que le chemin de montage était inclus dans le chemin comme vous l'avez expliqué dans le deuxième exemple. Merci!
Mike Cheel

En cas de nouvelle installation, vous devez vérifier que votre module express est correctement installé ( expressjs.com/en/starter/installing.html ), puis vous devez vérifier le chemin et le nom de votre répertoire comme l'a dit Giacomo;)
Spl2nky

utilisez toujours path.joinpour surmonter les problèmes de séparateur d'annuaire multiplateforme. path.join (__ dirname, '/')
Doug Chamberlain

35

J'ai le même problème. J'ai résolu le problème avec le code suivant:

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')));

Exemple de requête statique:

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

J'ai besoin d'une solution plus simple. Existe-t-il?


Merci de partager votre solution, qu'elle soit optimale ou non. Si vous souhaitez rouvrir le problème pour l'optimisation, pensez à publier une nouvelle question détaillant les nouvelles circonstances. Si l'optimisation est le seul objectif, la question peut être mieux adaptée à la révision du code SO .

15

default.css devrait être disponible à http://localhost:3001/default.css

Le stylesin app.use(express.static(__dirname + '/styles'));indique simplement à express de rechercher dans le stylesrépertoire un fichier statique à servir. Il ne fait pas (confusément) partie du chemin sur lequel il est disponible.


3
Totalement! Ce qui est par convention dans express.js vous le faites sur /publicqui a css, js, des imgdossiers afin que vous puissiez http://localhost:3001/css/default.css:)
Kit Sunde

15

Ce travail pour moi:

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

9

Dans votre server.js:

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

Vous avez déclaré express et app séparément, créez un dossier nommé «public» ou comme vous le souhaitez, et pourtant vous pouvez accéder à ces dossiers. Dans votre modèle src, vous avez ajouté le chemin relatif de / public (ou le nom de votre dossier destiné aux fichiers statiques). Méfiez-vous des bars sur les itinéraires.


6

Ce qui a fonctionné pour moi, c'est:

Au lieu d'écrire app.use(express.static(__dirname + 'public/images'));dans votre app.js

Ecrivez simplement app.use(express.static('public/images'));

c'est-à-dire supprimer le nom du répertoire racine dans le chemin. Et puis vous pouvez utiliser efficacement le chemin statique dans d'autres fichiers js, par exemple:

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

J'espère que cela t'aides :)


Cela a résolu mon problème. Dans mon code, le chemin vers CSS fonctionnait bien même avec la concaténation __dirname (en utilisant path.join), tandis que la récupération de js échouait.
Chim

Je suis heureux que cela ait aidé :)
Amir Aslam

5

J'utilise Bootstrap CSS, JS et Fonts dans mon application. J'ai créé un dossier appelé assetdans le répertoire racine de l'application et je place tous ces dossiers à l'intérieur. Puis dans le fichier serveur ajouté la ligne suivante:

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

Cette ligne me permet de charger les fichiers qui se trouvent dans le assetrépertoire à partir du /assetpréfixe de chemin comme: http://localhost:3000/asset/css/bootstrap.min.css.

Maintenant, dans les vues, je peux simplement inclure CSS et JS comme ci-dessous:

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

5

pour servir des fichiers statiques (css, images, fichiers js) en deux étapes seulement:

  1. passer le répertoire des fichiers css au middleware express.static intégré

    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. pour accéder aux fichiers ou images css, il suffit de taper l'URL http: // localhost: port / filename.css ex: http: // localhost: 8081 / bootstrap.css

note: pour lier des fichiers css à html, il suffit de taper<link href="file_name.css" rel="stylesheet">

si j'écris ce code

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

pour accéder aux fichiers statiques, tapez simplement url: localhost: port / css / filename.css ex: http: // localhost: 8081 / css / bootstrap.css

note pour lier des fichiers css avec html il suffit d'ajouter la ligne suivante

<link href="css/file_name.css" rel="stylesheet">    

3

celui-ci a fonctionné pour moi

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')));


1

Je trouve mon fichier css et j'y ajoute un itinéraire:

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

Ensuite, cela semble fonctionner.


Je ne recommanderais pas cette approche car vous devriez utiliser ExpressJS .use()et les express.static()méthodes pour envoyer où vous servez vos fichiers. Sinon, vous aurez un de ces routeurs par fichier dans votre répertoire public et c'est beaucoup de frais généraux à maintenir.
Sgnl

C'est un travail autour mais je ne pense pas que ce soit approprié. Si vous possédez de nombreux fichiers CSS et JS, comment pouvez-vous les conserver?
arsho

0

En plus de ce qui précède, assurez-vous que le chemin du fichier statique commence par / (ex ... / assets / css) ... pour servir les fichiers statiques dans n'importe quel répertoire au-dessus du répertoire principal (/ main)


2
Ajout à quoi ci-dessus? Indiquez-le dans votre réponse (remerciez la personne qui l'a publiée, si vous le devez). SO change souvent l'ordre des réponses afin que toutes les réponses soient vues et non les premières. Nous ne savons pas de quoi vous parlez.
Zachary Kniebel

0

si votre configuration

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

puis
mettez app.js

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

et référez-vous à votre style.css: (dans certains fichiers .pug):

link(rel='stylesheet', href='/static/stylesheets/style.css')

Pourquoi voudriez-vous introduire une étape de changement de nom public -> statique? Je dirais que c'est juste une information supplémentaire plus déroutante. Mais là encore, l'indirection est généralement une bonne chose ...
masterxilo

0
  1. Créez un dossier avec un nom «public» dans le
    dossier du projet Nodejs .
  2. Placez le fichier index.html dans le dossier du projet Nodejs.
  3. Mettez tous les scripts et fichiers css dans un dossier public.
  4. Utilisation app.use( express.static('public'));

  5. et dans le index.html bon chemin des scripts pour<script type="text/javascript" src="/javasrc/example.js"></script>

Et maintenant, tout fonctionne bien.


0

répertoire statique

vérifier l'image ci-dessus (répertoire statique) pour la structure de dir

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'))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.