2016-04-18 12 views
0

Ich habe folgendes Express 4 Ansicht Motor-Setup:Express-Lenker ist mein Layout oder partials nicht finden

var handlebars = require('express-handlebars').create({ 
    layoutsDir: path.join(__dirname, "views/layouts"), 
    partialsDir: path.join(__dirname, "views/partials"), 
    defaultLayout: 'layout', 
    extname: 'hbs' 
}); 

app.engine('handlebars', handlebars.engine); 
app.set('view engine', 'hbs'); 
app.set('views', path.join(__dirname, "views")); 

Ich habe die folgende Dateistruktur:

/views 
    error.hbs 
    index.hbs 
    /partials 
     menu.hbs 
    /layouts 
     layout.hbs 

Und schließlich in meiner Route : res.render('index');

Und meine Website besuchen, lädt es nur meine index.hbs Vorlage. Es verwendet nicht meine layout.hbs. Ich bekomme keine Fehler oder irgendetwas. Es verwendet einfach nicht das Layout, obwohl layout als mein Standard-Layout in der Konfiguration der Lenker eingestellt ist.

Next Ich habe versucht, meinen Code dies zu ändern:

res.render('index', {layout: 'layout'});

Jetzt bekomme ich den Fehler:

Error: ENOENT: no such file or directory, open '/.../views/layout.hbs'

So ist es wie es ist nicht meine layoutsDir zu finden ... Was Vermisse ich hier?

Weiter habe ich es so aus:

res.render('index', {layout: 'layouts/layout'});

Okay, so dass gearbeitet. Mein Layout ist jetzt geladen. Aber dann habe ich in einem Teil meines Layout:

{{> menu }}

Jetzt bekomme ich: /.../views/index.hbs: The partial menu could not be found

Also, was ist hier los? Wie kommt es, dass Lenker meine layoutsDir oder partialsDir nicht erkennt? Es sieht sie überhaupt nicht oder so. Und warum wurde defaultLayout nicht verwendet? Ich musste das Layout angeben.

Antwort

3

Nach dem API documentation für Express-Lenker, wenn Sie die Dateierweiterung aus der Standard ändern .handlebars dann, wenn Sie die Ansicht-Engine gesetzt, alle Vorkommen von Lenker sollten Sie verwenden möchten, mit der neuen Erweiterung ersetzt werden.

So Ihre ausdrückliche Setup müssen aktualisiert werden:

app.engine('hbs', handlebars.engine); 
app.set('view engine', 'hbs'); 
app.set('views', path.join(__dirname, "views")); 

Hinweis: Die Dokumentation verwendet eine Zeit vor der Erweiterung z.B. .hbs aber es scheint ohne dies zu funktionieren.

Voll Code:

var path = require('path'); 
var express = require('express'); 
var app = express(); 
var http = require('http').Server(app); 

var handlebars = require('express-handlebars').create({ 
    layoutsDir: path.join(__dirname, "views/layouts"), 
    partialsDir: path.join(__dirname, "views/partials"), 
    defaultLayout: 'layout', 
    extname: 'hbs' 
}); 

app.engine('hbs', handlebars.engine); 
app.set('view engine', 'hbs'); 
app.set('views', path.join(__dirname, "views")); 

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


http.listen(3000, function(){ 
    console.log("Server running"); 
}); 
+0

I umbenannt alles '.handlebars' und entfernt' hbs' Referenzen in meinem Code. Keine Änderung meiner Ergebnisse. –

+0

Ich habe meinen Beitrag mit dem vollständigen Code aktualisiert, den ich früher verwendet habe. Können Sie Unterschiede feststellen? Du hast deine App neu gestartet, nachdem du die Änderungen richtig vorgenommen hast? :) –

+0

Okay, aus irgendeinem Grund funktioniert es jetzt, sobald ich alles in '.hbs' umbenannt habe und deinen Code benutzt habe. Ich bin mir nicht sicher, was genau der Unterschied vorher war. Ja, ich habe den Knoten jedes Mal neu gestartet.Danke, –

Verwandte Themen