web-dev-qa-db-fra.com

Quelle est la meilleure pratique pour servir du HTML dans node.js avec express.js?

Je sers actuellement tout mon html directement dans mon fichier app.js/server.js comme ceci:

app.get('/', function(req, res) {
    res.render('index.html');
});
app.get('/about', function(req, res) {
    res.render('about.html');
});
app.get('/projects', function(req, res) {
    res.render('projects.html');
});

J'imagine que si j'ai plus de 15 pages html, ce n'est probablement pas la meilleure façon de les appeler. Existe-t-il un meilleur moyen de les servir à partir d'un autre fichier ou emplacement et d'utiliser l'exportation ou quelque chose pour pouvoir appeler une seule fonction ou quelque chose sur app.js. C'est peut-être à ça que sert le routage mais peut-être que je ne le comprends pas trop bien.

(plus de code ajouté dans le même fichier)

app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/public');

// used below code to render html files
app.engine('html', require('ejs').renderFile);

app.set('view engine', 'ejs');
app.use(express.favicon("public/img/favicon.ico"));
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
28
user2336703

Vous pouvez utiliser le middleware static:

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

Un exemple de serveur:

var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/public'));
app.listen(3000, function() { console.log('listening')});

Voici la structure du fichier:

.
├── public
│   ├── a.html
│   ├── b.html
│   └── c.html
└── server.js

Documentation:

75
Alberto Zaccagni

Une idée serait d'utiliser un type de fourre-tout comme dernier itinéraire, comme suit:

app.get('/:page', function(req, res) {
  res.sendfile(path.join(__dirname, 'public', 'pages', path.basename(req.params.page) + '.html'));
});

Cela nécessiterait que vous mettiez vos fichiers .html dans public/pages/about.html, etc.

Vous voudrez peut-être changer l'ordre du routeur de fichiers statiques afin que les fichiers statiques aient également la priorité sur les routes, sauf si vous voulez que cette route attrape des choses dans le dossier public, comme ceci:

app

app.set('view engine', 'ejs');
app.use(express.favicon("public/img/favicon.ico"));
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);
6
Jacob Gillespie