Jak używać HTML jako mechanizmu wyświetlania w Express?


134

Wypróbowałem tę prostą zmianę z seeda i utworzyłem odpowiednie pliki .html (np. Index.html).

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

i ten plik pozostał ten sam:

exports.index = function(req, res){
  res.render('index');
};

ale podczas biegu dostaję

Błąd 500: nie można znaleźć modułu „html”

Czy moja jedyna opcja to „ejs”? Moim zamiarem było użycie zwykłego HTML w połączeniu z AngularJS.


7
Zobacz ten temat, aby uzyskać odpowiedź: stackoverflow.com/questions/4529586/ ... Mam nadzieję, że to pomoże,
roland

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

Odpowiedzi:


93

Odpowiedzi z drugiego linku będą działać, ale aby wyświetlić HTML, nie ma potrzeby używania silnika widoku, chyba że chcesz skonfigurować funky routing. Zamiast tego po prostu użyj statycznego oprogramowania pośredniczącego:

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

3
Poszedłem dalej i skomentowałem odniesienie do app.set („silnik widoku”, html). Następnie otrzymałem komunikat o błędzie „Nie określono mechanizmu domyślnego i nie podano rozszerzenia”, co jest oczekiwane. Ale kiedy zmieniłem res.render („index”) na res.render („index.html”), otrzymałem następujący błąd: TypeError: „Silnik” właściwości obiektu # <View> nie jest funkcją.
Julio

4
Nie ma już silnika widoku, więc myślę, że nie res.render()będzie już działać. Zamiast tego umieść surowe pliki HTML publici pozwól statycznemu oprogramowaniu pośredniczącemu bezpośrednio obsługiwać pliki. Jeśli potrzebujesz bardziej wyszukanych tras, prawdopodobnie możesz skonfigurować własny silnik widoku HTML.
Nick McCurdy

6
Więc co piszesz w wywołaniu app.get ()?
ajbraus

5
@ajbraus nie potrzebujesz nawet wywołania app.get (). Będzie to po prostu obsługiwać wszystkie pliki html, które masz bezpośrednio w folderze / public. Więc w przeglądarce po prostu wskazujesz bezpośrednio na html i to wszystko ... w zasadzie bez routingu
dm76

Problem, który otrzymałem, polega na tym, że jeśli odświeżysz stronę po jej załadowaniu, pojawi się błąd z informacją o błędzie: Nie określono domyślnego silnika i nie podano rozszerzenia. wtedy jeśli używasz Auth, {provider: LocationStrategy, useClass: HashLocationStrategy}], umieszcza hash do twojego adresu URL, co jest uciążliwe z innych powodów. Czy jest na to sposób?
wuno

33

Aby silnik renderujący akceptował html zamiast jade, możesz wykonać następujące kroki;

  1. Zainstaluj konsolidację i przenieś do swojego katalogu.

     npm install consolidate
     npm install swig
    
  2. dodaj następujące wiersze do pliku app.js.

    var cons = require('consolidate');
    
    // view engine setup
    app.engine('html', cons.swig)
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'html');
    
  3. dodaj szablony widoków jako .html do folderu „widoki”. Zrestartuj swój serwer węzłowy i uruchom aplikację w przeglądarce.

Chociaż spowoduje to bezproblemowe wyświetlanie html, polecam korzystanie z JADE, ucząc się go. Jade to niesamowity silnik szablonów, którego poznanie pomoże Ci osiągnąć lepszy projekt i skalowalność.


nie ma metody 'silnik' - po wszystkich krokach
ImranNaqvi

Z jakiej wersji ekspresu korzystasz? Express 4.x zawiera interfejs API app.engine. Więcej informacji: @ expressjs.com/en/api.html#app.engine
AnandShanbhag.

Działało świetnie! Uwielbiam, gdy roczna odpowiedź działa za pierwszym razem.
Matthew Snell

dlaczego nadal nie mogę renderować mojego css i innych
frustrated-dev

23

W swoim apps.js po prostu dodaj

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');

Teraz możesz używać silnika widoku ejs, zachowując pliki widoku jako .html

źródło: http://www.makebetterthings.com/node-js/how-to-use-html-with-express-node-js/

Musisz zainstalować te dwa pakiety:

`npm install ejs --save`
`npm install path --save`

A następnie zaimportuj potrzebne pakiety:

`var path = require('path');`


W ten sposób możesz zapisać swoje widoki jako .html zamiast .ejs .
Bardzo pomocne podczas pracy z IDE, które obsługują html, ale nie rozpoznają ejs.


1
app.set ('widoki', ścieżka.join (__ nazwa katalogu, '/ ścieżka / do / twojego / folderu')); app.set ("opcje widoku", {układ: fałsz}); app.engine ('html', function (path, opt, fn) {fs.readFile (path, 'utf-8', function (error, str) {if (error) return str; return fn (null, str) ;});});
nilakantha singh deo

16

spróbuj tego dla swojej konfiguracji serwera

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

wtedy twoje funkcje zwrotne do tras będą wyglądać następująco:

function(req, res) {
    res.sendfile('./public/index.html');
};

14

Żaden silnik widoku nie jest potrzebny, jeśli chcesz używać angulara z prostym zwykłym plikiem HTML. Oto jak to zrobić: w route.jspliku:

router.get('/', (req, res) => {
   res.sendFile('index.html', {
     root: 'yourPathToIndexDirectory'
   });
});

1
Absolutnie najłatwiejsze rozwiązanie. Nie mam zainstalowanego / skonfigurowanego silnika widoku, a kod HTML jest wysyłany.
Newclique

7

Polecam korzystanie z https://www.npmjs.com/package/express-es6-template-engine - niezwykle lekkiego i niesamowicie szybkiego silnika szablonów. Nazwa jest nieco myląca, ponieważ może działać również bez wyrażeń expressj.

Podstawy wymagane do integracji express-es6-template-enginez Twoją aplikacją są dość proste i całkiem proste do wdrożenia:

const express = require('express'),
  es6Renderer = require('express-es6-template-engine'),
  app = express();
  
app.engine('html', es6Renderer);
app.set('views', 'views');
app.set('view engine', 'html');
 
app.get('/', function(req, res) {
  res.render('index', {locals: {title: 'Welcome!'}});
});
 
app.listen(3000);
Oto zawartość index.htmlpliku zlokalizowanego w katalogu „widoki”:

<!DOCTYPE html>
<html>
<body>
    <h1>${title}</h1>
</body>
</html>

4

Odpowiedź jest bardzo prosta. Aby renderować strony * .html, musisz użyć aplikacji app.engine („html”). spróbuj tego, to musi rozwiązać problem.

app.set('views', path.join(__dirname, 'views'));
**// Set EJS View Engine**
app.set('view engine','ejs');
**// Set HTML engine**
app.engine('html', require('ejs').renderFile);

plik .html będzie działać


2
Niekompletna odpowiedź. Gdzie są dokonywane te zmiany? Zakładając app.js, ale Twoja odpowiedź musi być konkretna. Ponadto prawdopodobnie nie wszystko to wymaga zmiany, ponieważ wynikiem wprowadzenia tylko tych trzech zmian / uzupełnień jest komunikat „Nie można znaleźć modułu 'ejs'”. Twoja odpowiedź jest prawdopodobnie bliska, ale musisz dodać trochę więcej informacji imho.
Newclique

Ponadto renderowanie to nie to samo, co udostępnianie pliku. Renderowanie wymaga, aby serwer wstępnie przetworzył plik i dodał dowolną zawartość dynamiczną przekazaną do metody renderowania. Może tego chciał OP, ale niektórzy ludzie mylą renderowanie z serwowaniem. Bardzo różne koncepcje.
Newclique

@wade służy do renderowania pliku html zamiast pliku ejs.
Dinesh Kanivu

3

Pliki HTML można renderować za pomocą silnika ejs:

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

Upewnij się, że pliki w folderze „/ views” mają nazwy „.ejs”.

Na przykład „index.ejs”.


Działa, ale wydaje się trochę hacky. Czy wiesz, czy są jakieś zastrzeżenia dotyczące używania .ejs zamiast .html? Pozdrawiam za prawdopodobnie najszybszą sugerowaną poprawkę!
mikeym

3

Skomentuj oprogramowanie pośredniczące dla html ie

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

Zamiast tego użyj:

app.get("/",(req,res)=>{
    res.sendFile("index.html");
});

2

html nie jest silnikiem przeglądania, ale ejs oferuje możliwość pisania w nim kodu HTML


2

Zainstaluj szablon ejs

npm install ejs --save

Polecaj ejs w app.js

app.set('views', path.join(__dirname, 'views'));`
app.set('view engine', 'ejs');

Utwórz szablon ejs w widokach, takich jak views / indes.ejs i użyj ejs tempalte na routerze

router.get('/', function(req, res, next) {
    res.render('index', { title: 'Express' });
});

1

do stron html serwera za pośrednictwem routingu, zrobiłem to.

var hbs = require('express-hbs');
app.engine('hbs', hbs.express4({
  partialsDir: __dirname + '/views/partials'
}));
app.set('views', __dirname + '/views');
app.set('view engine', 'hbs');

i przemianowałem moje pliki .html na .hbs - kierownice obsługują zwykły HTML


1

Aby silnik renderujący akceptował html zamiast jade, możesz wykonać następujące kroki;

Install consolidate and swig to your directory.

 npm install consolidate
 npm install swig

add following lines to your app.js file

var cons = require('consolidate');

// view engine setup
app.engine('html', cons.swig)
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

add your view templates as .html inside “views” folder. Restart you node server and start the app in the browser.

To powinno działać


1

Wypróbuj to proste rozwiązanie, zadziałało

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

1
powinieneś dodać wszystkie swoje linie, to samo w sobie nie działa.
MushyPeas

0

Renderuj szablon html za pomocą swig.

//require module swig    
    var swig = require('swig');

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

0

Pliki HTML nie muszą być renderowane.
mechanizm renderujący zamienia plik, który nie jest plikiem HTML, w plik HTML.
aby wysłać plik HTML, po prostu wykonaj:

res.sendFile("index.html");

być może będziesz musiał użyć, __dirname+"/index.html"więc express będzie znać dokładną ścieżkę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.