web-dev-qa-db-fra.com

Apprentissage Node - Le dossier Public Express ne fonctionne pas

Je suis donc nouveau sur le nœud et j'essaie d'apprendre à utiliser la bibliothèque express avec. Cependant, le problème que j'essaie de comprendre est la raison pour laquelle les fichiers de mon dossier /public Ne semblent pas être servis en tant que contenu statique.

Voici mon code:

var http = require('http');
var port = process.env.port || 1337;
var express = require('express');
var handlebars = require('express3-handlebars');
var path = require('path');

var application = express();

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

application.engine('handlebars', handlebars({ defaultLayout: 'main' }));

application.get('/', function(req, res){
    res.render('index.handlebars', { someProp: 3 });
});

application.listen(port);

Et ma structure de répertoire:

/
  - server.js (the above referenced file)
  / Views
    - index.handlebars
    / Layouts
      - main.handlebars
  / public
    - ServeMe.txt

Ma compréhension était que application.use(express.static(path.join(__dirname, 'public'))); était censé configurer le serveur pour répondre à toute demande dans le dossier public avec cette ressource si elle était trouvée. Qu'est-ce que je fais mal? Curieusement, il était plus facile de configurer le guidon comme moteur de visualisation que de faire fonctionner ce dossier public = D

EDIT: l'URL complète que j'essaie de demander: http://localhost:1337/public/serveme.txt

J'ai essayé la sensibilité à la casse (qui ne devrait pas être un problème), et cela n'a pas fonctionné non plus.

21
Tejs

L'URL complète que j'essaie de demander: http://localhost:1337/public/serveme.txt

C'est ton problème. Tout ce qui se trouve dans le répertoire que vous désignez comme contenu statique est disponible directement à partir de l'URL de base. Vous devez demander http://localhost:1337/serveme.txt au lieu.

Si vous souhaitez uniquement diffuser des fichiers statiques de /public vous pouvez passer une chaîne comme premier argument:

application.use("/public", express.static(path.join(__dirname, 'public')));
35
James Allardice

Depuis référence API Express

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

Cette ligne sert votre dossier public à l'URL racine de votre application, ce qui signifie que les demandes suivantes sont valides et ne donnent pas d'erreur 404.

// GET /javascripts/jquery.js // GET /style.css // GET /favicon.ico

app.use prend également un premier argument facultatif qui vous permet de spécifier l'URL de demande à laquelle vous souhaitez diffuser le contenu. Par défaut, ce premier argument est "/", ce qui signifie que votre contenu statique sera diffusé à l'URL de base. Si vous souhaitez que votre contenu statique ne soit pas diffusé au niveau racine, comme le fait actuellement votre code, consultez l'exemple suivant (à nouveau tiré des documents)

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

Cette ligne sert à nouveau votre dossier public, mais à l'URL statique/de votre application, ce qui rend les demandes suivantes valides sans erreur 404.

(Exemple d'URL: http://localhost:1337/static/anythingInYourPublicFolder)

// GET /static/javascripts/jquery.js // GET /static/style.css // GET /static/favicon.ico

21
Dylan Kirkby

Quelles URL essayez-vous de charger? Vous devez pas inclure "public" dans vos URL, donc curl -v 'http://localhost:1337/ServeMe.txt'.

2
Peter Lyons