J'ai une application de base node.js que j'essaie de mettre en œuvre à l'aide du cadre Express. J'ai un dossier views
où j'ai un fichier index.html
. Mais je reçois le message d'erreur suivant lors du chargement du navigateur Web.
Erreur: impossible de trouver le module 'html'
Ci-dessous 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 j'oublie ici?
Vous pouvez avoir jade inclure une page HTML simple:
dans views/index.jade
include plain.html
dans views/plain.html
<!DOCTYPE html>
...
et app.js peuvent toujours simplement rendre jade:
res.render(index)
Beaucoup de ces réponses sont obsolètes.
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 une syntaxe alternative et des mises en garde pour Express 3.4+:
app.set('view engine', 'ejs');
Ensuite, vous pouvez faire quelque chose comme:
app.get('/about', function (req, res)
{
res.render('about.html');
});
Cela suppose que vos vues se trouvent dans le sous-dossier views
et que vous avez installé le module de nœud ejs
. Sinon, exécutez ce qui suit sur une console Node:
npm install ejs --save
Du guide Express.js: Voir le rend
Les noms de fichiers d’affichage prennent la forme _
Express.ENGINE
_, oùENGINE
est le nom du module requis. Par exemple, la vue _layout.ejs
_ informera le système de vues derequire('ejs')
, le module en cours de chargement Vous devez exporter la méthodeexports.render(str, options)
pour vous conformer à Express. Toutefois,app.register()
peut être utilisé pour mapper les moteurs sur des extensions de fichier, afin que, par exemple, _foo.html
_ puisse être restitué par jade.
Donc, soit vous créez votre propre moteur de rendu simple, soit vous utilisez du jade:
_ app.register('.html', require('jade'));
_
Plus à propos de _app.register
_.
Notez que dans Express 3, cette méthode est renommée
app.engine
essaye ça. ç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");
});
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);
});
});
app.get('/', function (req, res) {
res.sendfile(__dirname + '/public/index.html');
});
Si vous utilisez express@~3.0.0 , modifiez la ligne ci-dessous à partir de votre exemple:
app.use(express.staticProvider(__dirname + '/public'));
à quelque chose comme ça:
app.set("view options", {layout: false});
app.use(express.static(__dirname + '/public'));
Je l'ai fait comme décrit sur page express api et cela fonctionne comme un charme. Avec cette configuration, vous n'avez pas à écrire de code supplémentaire, il devient donc assez facile à utiliser pour votre micro-production ou vos tests.
Code complet listé ci-dessous:
var express = require('express');
var app = express.createServer();
app.set("view options", {layout: false});
app.use(express.static(__dirname + '/public'));
app.get('/', function(req, res) {
res.render('index.html');
});
app.listen(8080, '127.0.0.1')
J'ai également rencontré le même problème dans express 3.X
et node 0.6.16
. La solution donnée ci-dessus ne fonctionnera pas pour la dernière version express 3.x
. Ils ont supprimé la méthode app.register
et ajouté la méthode app.engine
. Si vous avez essayé la solution ci-dessus, vous risquez de rencontrer l’erreur suivante.
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'register'
at Function.<anonymous> (/home/user1/ArunKumar/firstExpress/app.js:37:5)
at Function.configure (/home/user1/ArunKumar/firstExpress/node_modules/express/lib/application.js:399:61)
at Object.<anonymous> (/home/user1/ArunKumar/firstExpress/app.js:22:5)
at Module._compile (module.js:441:26)
at Object..js (module.js:459:10)
at Module.load (module.js:348:31)
at Function._load (module.js:308:12)
at Array.0 (module.js:479:10)
at EventEmitter._tickCallback (node.js:192:40)
Pour se débarrasser du message d'erreur. Ajoutez la ligne suivante à votre app.configure function
app.engine('html', require('ejs').renderFile);
Note: vous devez installer le moteur de template ejs
npm install -g ejs
Exemple:
app.configure(function(){
.....
// disable layout
app.set("view options", {layout: false});
app.engine('html', require('ejs').renderFile);
....
app.get('/', function(req, res){
res.render("index.html");
});
Note: La solution la plus simple consiste à utiliser le modèle ejs comme moteur de vue. Là, vous pouvez écrire du HTML brut dans les fichiers d’affichage * .ejs.
structure du dossier:
.
├── index.html
├── node_modules
│ ├──{...}
└── server.js
server.js
var express = require('express');
var app = express();
app.use(express.static('./'));
app.get('/', function(req, res) {
res.render('index.html');
});
app.listen(8882, '127.0.0.1')
index.html
<!DOCTYPE html>
<html>
<body>
<div> hello world </div>
</body>
</html>
sortie:
bonjour le monde
Si vous n'avez pas à utiliser le répertoire views, déplacez simplement les fichiers HTML dans le répertoire public ci-dessous.
puis ajoutez cette ligne dans app.configure au lieu de '/ vues'.
server.use (express.static (__ dirname + '/public'));
Pour rendre la page HTML dans le noeud, procédez comme suit:
app.set('views', __dirname + '/views');
app.engine('html', require('ejs').renderFile);
Vous devez installer le module ejs
à travers npm
comme:
npm install ejs --save
Pour mon projet, j'ai créé cette structure:
index.js
css/
reset.css
html/
index.html
Ce code sert à index.html pour les demandes /
et à reset.css pour les demandes /css/reset.css
. Assez simple, et la meilleure partie est qu’il ajoute automatiquement des en-têtes de cache.
var express = require('express'),
server = express();
server.configure(function () {
server.use('/css', express.static(__dirname + '/css'));
server.use(express.static(__dirname + '/html'));
});
server.listen(1337);
J'ai ajouté ci-dessous 2 lignes et ça marche pour moi
app.set('view engine', 'html');
app.engine('html', require('ejs').renderFile);
Essayez la fonction res.sendFile () dans Express routes.
var express = require("express");
var app = express();
var path = require("path");
app.get('/',function(req,res){
res.sendFile(path.join(__dirname+'/index.html'));
//__dirname : It will resolve to your project folder.
});
app.get('/about',function(req,res){
res.sendFile(path.join(__dirname+'/about.html'));
});
app.get('/sitemap',function(req,res){
res.sendFile(path.join(__dirname+'/sitemap.html'));
});
app.listen(3000);
console.log("Running at Port 3000");
Lire ici: http://codeforgeek.com/2015/01/render-html-file-expressjs/
Avec Express 4.0.0, la seule chose à faire est de commenter 2 lignes dans app.js:
/* app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); */ //or whatever the templating engine is.
Et déposez ensuite votre fichier statique dans le répertoire/public. Exemple: /public/index.html
Je ne voulais pas dépendre d'ejs pour simplement livrer un fichier HTML, alors j'ai tout simplement écrit le moteur de rendu minuscule:
const Promise = require( "bluebird" );
const fs = Promise.promisifyAll( require( "fs" ) );
app.set( "view engine", "html" );
app.engine( ".html", ( filename, request, done ) => {
fs.readFileAsync( filename, "utf-8" )
.then( html => done( null, html ) )
.catch( done );
} );
1) Le meilleur moyen est de définir un dossier statique. Dans votre fichier principal (app.js | server.js | ???):
app.use(express.static(path.join(__dirname, 'public')));
public/css/form.html
public/css/style.css
Ensuite, vous avez un fichier statique du dossier "public":
http://YOUR_DOMAIN/form.html
http://YOUR_DOMAIN/css/style.css
2)
Vous pouvez créer votre cache de fichiers.
Utilisez la méthode fs.readFileSync
var cache = {};
cache["index.html"] = fs.readFileSync( __dirname + '/public/form.html');
app.get('/', function(req, res){
res.setHeader('Content-Type', 'text/html');
res.send( cache["index.html"] );
};);
res.sendFile(__dirname + '/public/login.html');
J'essayais de configurer une application angular avec une API express RESTful et me suis retrouvé plusieurs fois sur cette page, même si cela n'a pas été utile. Voici ce que j'ai trouvé qui a fonctionné:
app.configure(function() {
app.use(express.static(__dirname + '/public')); // set the static files location
app.use(express.logger('dev')); // log every request to the console
app.use(express.bodyParser()); // pull information from html in POST
app.use(express.methodOverride()); // simulate DELETE and PUT
app.use(express.favicon(__dirname + '/public/img/favicon.ico'));
});
Ensuite, dans le rappel pour vos routes api ressembler à ceci: res.jsonp(users);
Votre infrastructure côté client peut gérer le routage. Express sert à servir l'API.
Mon itinéraire à domicile ressemble à ceci:
app.get('/*', function(req, res) {
res.sendfile('./public/index.html'); // load the single view file (angular will handle the page changes on the front-end)
});
Voici une démo complète du serveur express!
https://Gist.github.com/xgqfrms-GitHub/7697d5975bdffe8d474ac19ef906e906
espérons que cela vous aidera!
// simple express server for HTML pages!
// ES6 style
const express = require('express');
const fs = require('fs');
const hostname = '127.0.0.1';
const port = 3000;
const app = express();
let cache = [];// Array is OK!
cache[0] = fs.readFileSync( __dirname + '/index.html');
cache[1] = fs.readFileSync( __dirname + '/views/testview.html');
app.get('/', (req, res) => {
res.setHeader('Content-Type', 'text/html');
res.send( cache[0] );
});
app.get('/test', (req, res) => {
res.setHeader('Content-Type', 'text/html');
res.send( cache[1] );
});
app.listen(port, () => {
console.log(`
Server is running at http://${hostname}:${port}/
Server hostname ${hostname} is listening on port ${port}!
`);
});
app.get('/', function(req, res, next) {
res.send('<h1>My Server</h1>')
});
Ajoutez les lignes suivantes à votre code
Remplacez "jade" par "ejs" & "X.Y.Z" (version) par "*" dans le fichier package.json
"dependencies": {
"ejs": "*"
}
Ensuite, dans votre fichier app.js, ajoutez le code suivant:
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
Et n'oubliez pas de conserver tous les fichiers .HTML dans le dossier Views
À votre santé :)
Dans server.js, veuillez inclure
var express = require("express");
var app = express();
var path = require("path");
app.get('/',function(req,res){
res.sendFile(path.join(__dirname+'/index.html'));
//__dirname : It will resolve to your project folder.
});
Je voulais permettre aux demandes de "/" d'être traitées par un itinéraire Express alors qu'elles étaient auparavant traitées par le middleware statique. Cela me permettrait de restituer la version normale de index.html ou une version chargée JS et CSS concaténés + minifiés, en fonction des paramètres de l'application. Inspiré par réponse d'Andrew Homeyer , j'ai décidé de faire glisser mes fichiers HTML (non modifiés) dans un dossier de vues, configurez Express comme suit.
app.engine('html', swig.renderFile);
app.set('view engine', 'html');
app.set('views', __dirname + '/views');
Et créé un gestionnaire de route comme si
app.route('/')
.get(function(req, res){
if(config.useConcatendatedFiles){
return res.render('index-dist');
}
res.render('index');
});
Cela a assez bien fonctionné.
Si vous essayez de servir un fichier HTML contenant déjà tout son contenu, il n'a pas besoin d'être "rendu", il a simplement besoin d'être "servi". Le rendu correspond au moment où le serveur met à jour ou injecte le contenu avant que la page ne soit envoyée au navigateur. Des dépendances supplémentaires, telles que ejs, sont nécessaires, comme le montrent les autres réponses.
Si vous voulez simplement diriger le navigateur vers un fichier basé sur sa demande, vous devez utiliser res.sendFile () comme ceci:
const express = require('express');
const app = express();
var port = process.env.PORT || 3000; //Whichever port you want to run on
app.use(express.static('./folder_with_html')); //This ensures local references to cs and js files work
app.get('/', (req, res) => {
res.sendFile(__dirname + '/folder_with_html/index.html');
});
app.listen(port, () => console.log("lifted app; listening on port " + port));
De cette façon, vous n'avez pas besoin de dépendances supplémentaires à part Express. Si vous souhaitez simplement que le serveur envoie vos fichiers HTML déjà créés, la procédure ci-dessus est très simple.
Pour le HTML simple, vous n'avez besoin d'aucun paquet ou middleware npm
juste utiliser ceci:
app.get('/', function(req, res) {
res.sendFile('index.html');
});