318 votes

Rendre une vue HTML de base ?

J'ai une application node.js de base que j'essaie de faire décoller en utilisant le cadre Express. J'ai un views où j'ai un dossier index.html fichier. Mais je reçois l'erreur suivante lors du chargement du navigateur web.

Erreur : Impossible de trouver le module 'html'.

Voici mon code.

var express = require('express');
var app = express.createServer();

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

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

app.listen(8080, '127.0.0.1')

Qu'est-ce que je rate ici ?

315voto

Andrew Homeyer Points 2036

Vous pouvez demander à jade d'inclure une page HTML simple :

dans views/index.jade

include plain.html

dans views/plain.html

<!DOCTYPE html>
...

et app.js peut toujours juste rendre Jade :

res.render(index)

2 votes

Je tiens à préciser que ce que je voulais, c'était de ne servir qu'un seul fichier .html car mon application ne comportait qu'une seule page ;)

0 votes

Cette réponse est excellente. Vous pouvez également continuer à utiliser la mise en page et placer l'include à l'intérieur du bloc de contenu.

1 votes

Peut-on inclure plusieurs pages HTML/JS avec cette méthode ?

252voto

Drew Noakes Points 69288

Beaucoup de ces réponses sont dépassées.

En utilisant express 3.0.0 et 3.1.0, ce qui suit fonctionne :

app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);

Voir les commentaires ci-dessous pour la syntaxe alternative et les avertissements pour express 3.4+ :

app.set('view engine', 'ejs');

Alors vous pouvez faire quelque chose comme :

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

Cela suppose que vous avez vos vues dans le views et que vous avez installé l'application ejs module de nœud. Si ce n'est pas le cas, exécutez ce qui suit sur une console Node :

npm install ejs --save

0 votes

Pourquoi le res.render nécessite-t-il l'extension .html dans ce cas mais pas dans le cas par défaut avec jade. avec le code passe-partout, il appelle simplement res.render('index', { title : 'Express' }) ; mais ici, c'est : res.render('about.html') ;

0 votes

@Transcendance, je ne suis pas sûr exactement. Vous devriez peut-être ouvrir une nouvelle question.

7 votes

Avec Express 3.4.2 : app.set('view engine', 'ejs') ;

73voto

Ivo Wetzel Points 27802

Du Guide Express.js : Rendu de vue

Les noms de fichiers d'affichage prennent la forme Express.ENGINE , donde ENGINE est le nom du module qui sera requis. Par exemple, la vue layout.ejs dira au système d'affichage de require('ejs') le module en cours de chargement doit exporter la méthode exports.render(str, options) pour se conformer à l'Express, cependant app.register() peut être utilisé pour faire correspondre les moteurs aux extensions de fichier, de sorte que, par exemple foo.html peut être rendu par du jade.

Donc, soit vous créez votre propre moteur de rendu simple, soit vous utilisez simplement Jade :

 app.register('.html', require('jade'));

[Plus de](http://expressjs.com/2x/guide.html#app.register()) à propos de app.register .

Notez que dans l'Express 3, cette méthode est renommée app.engine

57 votes

Note- app.register a été renommé app.engine dans Express 3.

8 votes

Voir la réponse d'Andrew Homeyer. C'est la réponse actuelle.

7 votes

D'après une autre réponse, pour Express 4, j'ai fini par utiliser app.engine('.html', require('ejs').renderFile);

61voto

keegan3d Points 2244

Vous pouvez également lire le fichier HTML et l'envoyer :

app.get('/', (req, res) => {
    fs.readFile(__dirname + '/public/index.html', 'utf8', (err, text) => {
        res.send(text);
    });
});

26 votes

Cette solution est mauvaise car il n'y a pas de mise en cache des fichiers ; ils sont lus à chaque requête.

2 votes

Il est potentiellement assez facile de le mettre en cache manuellement. Il suffit de stocker le fichier lu dans une variable, et de ne le relire que si cette variable est vide. Vous pourriez également utiliser un objet JS et stocker différents fichiers dans différentes variables, avec des horodatages. Bien sûr, c'est plus de travail que la plupart des gens feraient, mais c'est bon pour les personnes qui ne connaissent pas les nœuds. C'est facile à comprendre

7 votes

Oups. Cela va à l'encontre de l'objectif des architectures rationalisées et orientées vers les conventions (comme MVC).

46voto

spectrum Points 576

Essayez ceci. Ça marche pour moi.

app.configure(function(){

  .....

  // disable layout
  app.set("view options", {layout: false});

  // make a custom html template
  app.register('.html', {
    compile: function(str, options){
      return function(locals){
        return str;
      };
    }
  });
});

....

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

2 votes

J'ai eu des problèmes avec la configuration exacte ci-dessus, donc j'ai enlevé le point de ".html" et ajouté ceci : app.set('view engine', 'html') ; app.set('views', __dirname + '/views') ; pour un rendu parfait

8 votes

C'est un peu bizarre... vous devriez servir le html comme des fichiers statiques. Cela vous donne également l'avantage d'une meilleure mise en cache. La création d'un "compilateur html" personnalisé semble erronée. Si vous devez envoyer un fichier à partir d'une route (ce qui est très rarement le cas), il suffit de le lire et de l'envoyer. Sinon, il suffit de rediriger vers le fichier html statique.

2 votes

@Enyo ce commentaire semble étrange, étant donné que COMMENT faire ce que vous dites devrait être fait est LA QUESTION POSÉE, et votre réponse est de simplement le faire. Comment servir un html statique avec une mise en cache ?

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