268 votes

fichiers statiques avec express.js

Je veux servir index.html y /media en tant que fichiers statiques. Le fichier d'index doit être servi à la fois à /index.html y / URLs.

J'ai

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

mais la deuxième ligne sert apparemment à l'ensemble __dirname y compris tous les fichiers qu'il contient (pas seulement index.html y media ), ce que je ne veux pas.

J'ai aussi essayé

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

mais en accédant à l'URL de base / conduit ensuite à une demande de web_server/index.html/index.html (double index.html ), qui échoue bien sûr.

Des idées ?


D'ailleurs, je n'ai trouvé absolument aucune documentation dans Express sur ce sujet ( static() + ses paramètres)... frustrant. Un lien vers la doc est également le bienvenu.

6 votes

A partir d'express 4.x, express.static() est traité par serve-static Vous pouvez trouver sa documentation à l'adresse suivante npmjs.com/package/serve-static o github.com/expressjs/serve-static .

0 votes

Quelqu'un peut-il expliquer ce que signifie "serveur en tant que fichiers statiques" ?

0 votes

@iLiveInAPineappleUnderTheSea Dans une application web dynamique, comme lorsqu'on utilise Express, le contenu de la page est créé - ou généré - par l'application. En revanche, les fichiers statiques sont servis (la plupart du temps) sans être modifiés à partir d'une hiérarchie de répertoires statiques. Par exemple, si les pages peuvent changer, les fichiers d'image, les fichiers CSS et les fichiers Javascript ne changent pas.

225voto

250R Points 5600

Si vous avez cette configuration

/app
   /public/index.html
   /media

Alors ceci devrait obtenir ce que vous vouliez

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

L'astuce consiste à laisser cette ligne comme dernier recours

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

En ce qui concerne la documentation, étant donné qu'Express utilise le middleware connect, j'ai trouvé plus facile de consulter directement le code source de connect.

Par exemple, cette ligne montre que le fichier index.html est supporté. https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L140

22 votes

Application.configure() était documenté comme un héritage dans la version 3.x et supprimé dans la version 4.x. Voir la réponse de ChrisCantrell pour un exemple mis à jour.

0 votes

Merci, cela m'a beaucoup aidé.

0 votes

Qu'est-ce que le __dirname ? Quelle est sa valeur ?

158voto

ChrisCantrell Points 828

Dans la dernière version d'express, le "createServer" est déprécié. Cet exemple fonctionne pour moi :

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

0 votes

__dirname est un mot-clé ?

6 votes

C'est un global dans votre module nodejs. nodejs.org/docs/latest/api/globals.html#globals_dirname

7 votes

__dirname n'est pas réellement un global mais plutôt local à chaque module.

118voto

abe Points 592

express.static() s'attend à ce que le premier paramètre soit un chemin d'un répertoire, pas d'un nom de fichier. Je suggérerais de créer un autre sous-répertoire pour contenir votre index.html et l'utiliser.

Servir des fichiers statiques dans Express documentation ou plus détaillé serve-static documentation y compris le comportement par défaut du service index.html :

Par défaut, ce module enverra les fichiers "index.html" en réponse à une requête sur un répertoire. Pour désactiver cela, mettez false ou pour fournir un nouvel index, passez une chaîne ou un tableau dans l'ordre souhaité.

7 votes

Et juste pour information, il servira index.html par défaut dans cet autre répertoire.

0 votes

S'il n'y a qu'un seul paramètre - alors express.static s'attend à ce qu'un paramètre soit path....

59voto

student Points 87

res.sendFile & express.static les deux fonctionneront pour cela

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

public est le dossier dans lequel se trouve le code côté client.

Comme Proposition de par @ATOzTOA y clarifié par @Vozzie , path.join prend les chemins à joindre comme arguments, le + passe un seul argument à path.

3 votes

path.join prend les chemins à joindre comme arguments, le + passe un seul argument à path.

0 votes

@ATOzTOA pouvez-vous nous en dire plus ?

0 votes

Ce que @ATOzTOA veut dire, c'est que vous devriez changer path.join(public + 'index.html') sur path.join(public, 'index.html') Et pendant que vous y êtes, changez __dirname + "/public/" sur path.join(__dirname, 'public')

10voto

rajmobiapp Points 669
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')
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X