web-dev-qa-db-fra.com

fichiers statiques avec express.js

Je veux servir le sous-répertoire index.html et /media sous forme de fichiers statiques. Le fichier d'index doit être servi aux URL /index.html et /.

J'ai

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

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

J'ai aussi essayé

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

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

Des idées?


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

190
user124114

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

Servir des fichiers statiques dans Express documentation , ou documentation plus détaillée de serve-static , y compris comportement par défaut de la distribution de index.html :

Par défaut, ce module enverra des fichiers "index.html" en réponse à une demande sur un répertoire. Pour désactiver cet ensemble, indiquez false ou pour fournir un nouvel index, transmettez une chaîne ou un tableau dans l'ordre de votre choix.

85
abe

Si vous avez cette configuration

/app
   /public/index.html
   /media

Ensuite, cela 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 est de laisser cette ligne comme dernier repli

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

Pour ce qui est de la documentation, comme Express utilise le middleware Connect, j’ai trouvé plus facile de regarder directement le code source de Connect.

Par exemple, cette ligne indique que index.html est pris en charge https://github.com/senchalabs/connect/blob/2.3.3/lib/middleware/static.js#L14

175
250R

Dans la version la plus récente d'Express, "createServer" est obsolète. 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');
123
ChrisCantrell

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 le code côté client est

Comme suggéré par @ ATOzTOA et clarifié par@ Vozzie , path.join prend les chemins à rejoindre en tant que arguments, le + passe un seul argument à path.

34
student

npm install serve-index

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 );
})
2
Rejayi CS

utiliser ci-dessous dans votre app.js

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

(folderName est un dossier contenant des fichiers) - rappelez-vous que ces ressources sont accessibles directement via le chemin du serveur (c'est-à-dire http: // localhost: 3000/abc.png (où abc.png se trouve dans le dossier folderName)

2
Pravin
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')
})
0
rajmobiapp