Temel HTML görünümü oluşturulsun mu?


279

Express framework kullanarak yerden almaya çalışıyorum temel bir node.js uygulaması var. Dosyamın olduğu bir viewsklasör var index.html. Ancak web tarayıcıyı yüklerken aşağıdaki hatayı alıyorum.

Hata: 'html' modülü bulunamıyor

Kodum aşağıda.

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')

Burada ne eksik?

Yanıtlar:


298

Jade'in düz bir HTML sayfası eklemesini sağlayabilirsiniz:

in views / index.jade

include plain.html

görünümlerde / plain.html

<!DOCTYPE html>
...

ve app.js hala yeşim taşıyabilir:

res.render(index)

1
Sadece benim app tek sayfa olduğu için sadece bir .html dosyası hizmet etmek istediğimi not etmek;)
diosney

1
Bu yöntemle birden fazla HTML / JS sayfası ekleyebilir miyiz?
user3398326

6
sadece html sayfasını sadece ekspresin ilk testi için bir yeşim şablonu olmadan oluşturabilmelisiniz?
PositiveGuy

1
Her HTML dosyamız için bir yeşim şablonu oluşturmamız gerekiyor mu?
Chris - Jr

4
Bir çözüm yerine bir hack daha.
Ozil

226

Bu cevapların çoğu güncel değil.

Express 3.0.0 ve 3.1.0 kullanıldığında aşağıdakiler çalışır:

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

Express 3.4+ için alternatif sözdizimi ve uyarılar için aşağıdaki yorumlara bakın:

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

Sonra şöyle bir şey yapabilirsiniz:

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

Bu, görüşlerinizi viewsalt klasörde bulduğunuzu ve ejsdüğüm modülünü kurduğunuzu varsayar . Değilse, bir Düğüm konsolunda aşağıdakileri çalıştırın:

npm install ejs --save

@MichaelDausmann, şerefe, cevaba bu bilgiyi ekledim.
Drew Noakes

res.render neden bu durumda .html uzantısını gerektirir ancak jade ile varsayılan durumda gerektirmez. kazan plakası koduyla, res.render ('index', {title: 'Express'}); ancak burada: res.render ('about.html');
Aşk

6
Express 3.4.2 ile: app.set ('görüntüleme motoru', 'ejs');
roland

3
Paketinizi güncellemek için 'npm install ejs --save' komutunu kullanmalısınız.json
Tom Teman

8
neden ejs'e ihtiyacın var?
PositiveGuy

71

Express.js Kılavuzundan: Görüntüleme İşlemini Görüntüle

Görünüm dosya adları Express.ENGINE, ENGINEgerekli modülün adı olan formu alır . Örneğin görünüm layout.ejsgörünüm sistemine söyleyecektir,require('ejs') yüklenen modül Express'e uymak için yöntemi dışaexports.render(str, options) aktarmalıdır, ancak app.register()motorları dosya uzantılarıyla eşleştirmek için kullanılabilir, böylece örneğin foo.htmlyeşim taşı ile oluşturulabilir.

Yani ya kendi basit oluşturucunuzu yaratırsınız ya da sadece yeşim kullanırsınız:

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

Hakkında daha fazla bilgi app.register.

Express 3'te bu yöntemin yeniden adlandırıldığını unutmayın app.engine


57
Not- app.register, Express 3'te app.engine olarak yeniden adlandırıldı.
Spongeboy

8
Andrew Homeyer'in cevabına bakınız. Asıl cevap bu.
David Betz

7
Diğer bazı cevaplardan, Express 4 için ben kullanarak sona erdiapp.engine('.html', require('ejs').renderFile);
CrazyPyro

Ekspres 4'te şunları da kullanabilirsiniz: app.set ('görünüm motoru', 'yeşim');
Daniel Huang

48

Ayrıca HTML dosyasını okuyabilir ve gönderebilirsiniz:

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

23
bu çözüm kötüdür çünkü dosyaları önbelleğe almaz; her istek için okunur.
Marcel Falliere

2
manuel olarak önbelleğe alması oldukça kolaydır. Sadece okuma dosyasını bir değişken saklayın ve yalnızca bu değişken boşsa tekrar okuyun. Ayrıca bir JS nesnesi kullanabilir ve zaman damgası içeren çeşitli değişkenlerde çeşitli dosyalar depolayabilirsiniz. Elbette, çoğu insanın yapabileceğinden daha fazla iş, ancak düğüme yeni gelen insanlarda iyi. Anlamak kolay
Naman Goel

5
Amanın. Bu, konvansiyona yönelik, aerodinamik mimarilerin (MVC gibi) tüm noktasını yener.
David Betz

@MarcelFalliere Dosyayı önbelleğe almak istediğini veya özel bir önbellekleme çözümü kullanmak istemediğini varsayıyorsunuz. Cevap için teşekkür ederim keegan3d.
Benny

@MarcelFalliere O zaman doğru çözüm nedir? Yeni bağımlılıklar gerektiren başka cevaplar görüyorum. Sadece html dosyaları sunmak için gerekli mi?
JCarlosR

45

bunu dene. benim için çalışıyor.

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
yukarıdaki tam yapılandırmayla ilgili sorun yaşadım, bu yüzden ".html" den noktayı kaldırdım ve bunu ekledim: app.set ('view engine', 'html'); app.set ('görünümler', __dirname + '/ görünümler'); Bir de mükemmel için işlemek
Bijou Trouvaille

8
Bu biraz garip ... html'yi statik dosyalar olarak sunmalısınız. Bu aynı zamanda daha iyi önbellekleme avantajı sağlar. Özel bir "html derleyicisi" oluşturmak yanlış görünüyor. Bir rotadan (çok nadiren yapmanız gereken) bir dosya göndermeniz gerekiyorsa, sadece okuyun ve gönderin. Aksi takdirde, statik html'ye yönlendirmeniz yeterlidir.
enyo

2
@Enyo bu yorum garip görünüyor, söylediğiniz şeyi nasıl yapmalısınız düşünülüyor SORU SORULAN SORU ve cevabınız sadece bunu yapmak. Önbellekli statik bir HTML'yi nasıl sunuyorsunuz?
Kyeotic

3
Tarihinde bir hata görüyorum app.register. Belki de 3.0.0.rc3 ekspresinde kullanımdan kaldırılmıştır? TypeError: Object function app(req, res){ app.handle(req, res); } has no method 'register'
Drew Noakes

1
@enyo, buharlı mimarinin noktasını kaçırdınız. Desen denetleyici / görünüm (veya / belirli bir mimariniz ne olursa olsun / işlemci / görünüm) olduğunda, eski uzantı modeli ile bundan sapamazsınız. HTML'nizi diğer her şey gibi işlenmiş içerik olarak ele almanız gerekir. KURU tut, ahbap.
David Betz


19

Express@~3.0.0 kullanıyorsanız aşağıdaki satırı örneğinizden değiştirin:

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

böyle bir şeye:

app.set("view options", {layout: false});
app.use(express.static(__dirname + '/public'));

Hızlı api sayfasında açıklandığı gibi yaptım ve çekicilik gibi çalışır. Bu kurulumla ek kod yazmak zorunda kalmazsınız, böylece mikro üretiminiz veya testiniz için kullanmak yeterince kolay olur.

Tam kod aşağıda listelenmiştir:

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')

1
app.use(express.static(__dirname + '/public'));Sunucuyu ile başlattıktan sonra neden tekrarlıyorsunuz app.listen?
fatuhoku

2
html sayfasını statik olarak sunmanın ve sadece express ile statik olmayan olarak yüklemenin farkı nedir?
PositiveGuy

14

Ben de aynı sorunla karşı karşıya express 3.Xve node 0.6.16. Yukarıda verilen çözüm en son sürüm için çalışmaz express 3.x. app.registerYöntemi kaldırdılar ve yöntem eklediler app.engine. Yukarıdaki çözümü denediyseniz, aşağıdaki hatayla karşılaşabilirsiniz.

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)

Hata mesajından kurtulmak için. Aşağıdaki satırıapp.configure function

app.engine('html', require('ejs').renderFile);

Not: ejsşablon motorunu kurmanız gerekir

npm install -g ejs

Misal:

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");
});

Not: En basit çözüm ejs şablonunu görüntüleme motoru olarak kullanmaktır. Orada * .ejs görünüm dosyalarına ham HTML yazabilirsiniz.


3
ejsGlobal olarak yüklemeniz gerekiyor mu?
Drew Noakes

bana 'index.html' dosyasını bulamadığını söyle
MetaGuru

9

klasör yapısı:

.
├── 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>

çıktı:

Selam Dünya


7

Views dizinini kullanmak zorunda değilseniz, html dosyalarını herkese açık olarak taşıyın aşağıdaki dizine .

ve ardından bu satırı '/ views' yerine app.configure dosyasına ekleyin.

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

5

Html sayfasını düğümde oluşturmak için aşağıdakileri deneyin,

app.set('views', __dirname + '/views');

app.engine('html', require('ejs').renderFile);
  • ejsModülü aşağıdaki şekilde kurmanız gerekir npm:

       npm install ejs --save

Bu çözüm benim için çalıştı. Ben de statik seçeneği denedim rağmen. Arkasındaki mekanizmayı açıklayabilir misiniz? Teşekkürler!
harshad

4

Projem için bu yapıyı oluşturdum:

index.js
css/
    reset.css
html/
    index.html

Bu kod, /istekler için index.html ve istekler için reset.css sunar /css/reset.css. Yeterince basit ve en iyi yanı otomatik olarak önbellek üstbilgileri eklemesidir .

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);

3

1) En iyi yol statik klasörü ayarlamaktır. Ana dosyanızda (app.js | server.js | ???):

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

public / css / form.html
public / css / style.css

Sonra "public" klasöründen statik dosya var:

http://YOUR_DOMAIN/form.html
http://YOUR_DOMAIN/css/style.css

2)

Dosya önbelleğinizi oluşturabilirsiniz.
Fs.readFileSync yöntemini kullanın

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"] );                                
};);


3

Express 4.0.0 ile yapmanız gereken tek şey app.js'deki 2 satırı yorumlamaktır:

/* app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); */ //or whatever the templating engine is.

Ardından statik dosyanızı / public dizinine bırakın. Örnek: /public/index.html


3

2 satırın altına ekledim ve benim için çalışıyor

    app.set('view engine', 'html');
    app.engine('html', require('ejs').renderFile);

bana şu hatayı veriyor "Hata: Function.Module._resolveFilename (module.js: 338: 15) 'de Function.Module._load (module.js: 280: 25)' de Module.require (module.js: 280: 25) 'de bulunamadı. module.js: 364: 17) gerektirir (module.js: 380: 17) "
Lygub Org

@LygubOrg npm install ejs --saveçalışma dizininizde çalışır.
A1rPun

1
yalnızca html dosyasına hizmet vermek için bağımlılık eklemek gerekir mi?
JCarlosR

3

Express yollarında res.sendFile () işlevini deneyin.

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");

Burayı okuyun: http://codeforgeek.com/2015/01/render-html-file-expressjs/


3

Ben sadece bir HTML dosyası teslim için ejs bağımlı istemiyordu, bu yüzden sadece küçük render kendim yazdım:

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 );
} );

2

Hızlı bir RESTful API ile açısal bir uygulama kurmaya çalışıyordum ve yardımcı olmadı, ancak bu sayfaya birkaç kez indi. İşte işe yarayan buldum:

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'));
});

Sonra api rotalarınız için geri aramada şöyle görünür: res.jsonp(users);

İstemci tarafı çerçeveniz yönlendirmeyi işleyebilir. Express, API'yi sunmak içindir.

Ana rotam şöyle:

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)
});


2

İşte ekspres sunucunun tam bir dosya demosu!

https://gist.github.com/xgqfrms-GitHub/7697d5975bdffe8d474ac19ef906e906

sizin için yardımcı olacağını umuyoruz!

// 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}!
    `);
});


1

Aşağıdaki satırları kodunuza ekleyin

  1. Package.json dosyasındaki "jade" yerine "ejs" ve "XYZ" (sürüm) yerine "*" yazın

      "dependencies": {
       "ejs": "*"
      }
  2. Sonra app.js dosyanızda Aşağıdaki Kodu ekleyin:

    app.engine('html', require('ejs').renderFile);

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

  3. Ve Unutmayın Tüm .HTML dosyalarını görünümlerde tut Klasör

Şerefe :)


1

Düz HTML için herhangi bir npm paketi veya ara katman yazılımı gerekmez

sadece şunu kullanın:

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

1

Yaklaşık 2020 olması hala çok üzücü sendFile, responsenesnenin yöntemini kullanmadan bir HTML sayfası oluşturmanın bir yolunu eklemedi . Kullanmak sendFilebir sorun değildir, ancak argümanı ona şeklinde iletmek path.join(__dirname, 'relative/path/to/file')doğru hissetmez. Bir kullanıcı neden __dirnamedosya yoluna katılmalı ? Varsayılan olarak yapılmalıdır. Neden sunucunun kökü proje dizinini saptırarak olamaz? Ayrıca, yalnızca statik bir HTML dosyası oluşturmak için geçici bir bağımlılık yüklemek yine doğru değildir. Sorunu çözmek için doğru yolu bilmiyorum, ancak statik bir HTML sunmak zorunda olsaydım, o zaman şöyle bir şey yaparım:

const PORT = 8154;

const express = require('express');
const app = express();

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

app.listen(PORT, () => {
    console.log(`Server is listening at port http://localhost:${PORT}`);
});

Yukarıdaki örnek, proje yapısının bir viewsdizine sahip olduğunu ve statik HTML dosyalarının içinde olduğunu varsayar . Örneğin, diyelim ki viewsdizin adlı iki HTML dosyaları vardır index.htmlve about.html: bunları biz ziyaret edebilirsiniz erişmek sonra, localhost:8153/index.htmlya da sadece localhost:8153/yük index.htmlsayfası ve localhost:8153/about.htmlyüklemek için about.html. Benzer bir yaklaşımı, yapay viewsdizinleri dizinde saklayarak veya yalnızca varsayılan dist/<project-name>dizini kullanarak ve bunu sunucu js'de aşağıdaki gibi yapılandırarak bir tepki / açısal uygulama sunmak için kullanabiliriz :

app.use(express.static('dist/<project-name>'));

0

Daha önce statik ara katman yazılımı tarafından ele alındığı bir Express yolu tarafından "/" isteklerine izin vermek istedim. Bu, uygulama ayarlarına bağlı olarak index.html dosyasının normal sürümünü veya birleştirilmiş + simge durumuna küçültülmüş JS ve CSS yüklenen bir sürümünü oluşturmama olanak tanır. Andrew Homeyer'in cevabından esinlenerek , HTML dosyalarımı değiştirilmemiş bir görünüm klasörüne sürüklemeye karar verdim, Express'i böyle yapılandırın

   app.engine('html', swig.renderFile);
   app.set('view engine', 'html');
   app.set('views', __dirname + '/views');  

Ve böyle bir yol işleyici yarattı

 app.route('/')
        .get(function(req, res){
            if(config.useConcatendatedFiles){
                return res.render('index-dist');
            }
            res.render('index');       
        });

Bu oldukça iyi sonuç verdi.


0

Server.js'de lütfen ekleyin

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.
});

0

Zaten tüm içeriğinin içinde bulunduğu bir HTML dosyasını sunmaya çalışıyorsanız, 'işlenmesi' gerekmez, sadece 'sunulması' gerekir. Görüntüleme, sayfa tarayıcıya gönderilmeden önce sunucuyu güncellemeniz veya içerik enjekte etmenizdir ve diğer yanıtların gösterdiği gibi ejs gibi ek bağımlılıklar gerektirir.

Tarayıcıyı isteklerine göre bir dosyaya yönlendirmek istiyorsanız, res.sendFile () yöntemini şu şekilde kullanmalısınız:

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));

Bu şekilde, ifade dışında ek bağımlılıklara da ihtiyacınız olmaz. Sunucunun zaten oluşturulmuş html dosyalarınızı göndermesini istiyorsanız, yukarıdaki işlem çok hafif bir yoldur.


0

index.js

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


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


app.listen(3400, () => {
    console.log('Server is running at port 3400');
})

İndex.html dosyanızı ortak klasöre yerleştirin

<!DOCTYPE html>
<html>
<head>
    <title>Render index html file</title>
</head>
<body>
    <h1> I am from public/index.html </h1>
</body>
</html>

Şimdi terminalinizde aşağıdaki kodu çalıştırın

düğüm index.js


-1

Bunu genellikle kullanırım

app.configure(function() {
    app.use(express.static(__dirname + '/web'));
});

Dikkatli olun çünkü bu / web dizinindeki herhangi bir şeyi paylaşacaktır.

Umut ediyorum bu yardım eder


-2

node.js için hızlı çerçeve kullanıyorsanız

npm ejs yükle

sonra yapılandırma dosyasını ekle

app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router)

;

ihracat modülü form.js sayfasından render ejs dosya adı uzantısı ile views dir html dosyası var form.html.ejs

sonra form.js dosyasını oluşturun

res.render('form.html.ejs');


Bu karışıklık nedir?
Vighnesh Raut
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.