2017-10-19 3 views
0

Ich schreibe eine kleine NodeJS/Express-App. Ich habe bis Mops als Template-Engine:pug.compile() kann keine Vorlagendateien finden (res.render() kann)

const app = express(); 

app.set('view engine', 'pug'); 
app.set('views', __dirname + "/public/views"); 
app.use(express.static(__dirname + '/public/static')); 

Dies funktioniert gut, wenn ein res.render() Aufruf HTML Antworten senden:

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

Aber wenn ich versuche, kleine Komponenten zu machen und sammeln sie in einem String oder ein Array als Antwort auf einen AJAX-Aufruf, ich kann es nicht zum Laufen bringen.

const pug = require('pug'); 
const compile = pug.compileFile('option.pug'); 

Dies führt immer zu Error: ENOENT: no such file or directory, open 'option.pug'. Ich habe versucht, den Pfad zur Perspektive des Routers zu ändern (so etwas wie ../../public/views/option.pug), aber das hilft auch nicht.

Ich weiß nicht, warum die Pfade unterschiedlich interpretiert werden.

Wie beziehe ich mich auf diese Vorlage bei der Verwendung von pug.compileFile?

Antwort

2

Von dem Mops-Quellcode wird der übergebene Pfad als filename in den Optionen einstellen:

https://github.com/pugjs/pug/blob/926f7c720112cac76cfedb003e25e9f43d3a1767/packages/pug/lib/index.js#L354

die Datei zu lesen Dies wird dann zu handleTemplateCache geben:

https://github.com/pugjs/pug/blob/926f7c720112cac76cfedb003e25e9f43d3a1767/packages/pug/lib/index.js#L215

Letztendlich wird der Pfad nur an fs.readFileSync übergeben, der relative Pfade als relativ zum aktuellen Arbeitsverzeichnis behandelt, process.cwd().

Sie könnten den entsprechenden Pfad mit so etwas wie diese erzeugen:

const file = app.get('views') + '/option.pug'; 

Es wäre besser, path.join zu verwenden, anstatt die String-Verkettung für den Bau von Wegen, https://nodejs.org/api/path.html#path_path_join_paths

const path = require('path'); 
const file = path.join(app.get('views'), 'option.pug'); 

Wenn Sie nicht tun wollen (oder können nicht) app.get('views') verwenden, könnten Sie einfach den absoluten Pfad auf andere Weise aufbauen, zB indem Sie direkt __dirname verwenden.

Beachten Sie auch, dass Sie einen Rückruf an res.render übergeben können, der das gerenderte HTML übergeben wird, anstatt es in die Antwort zu schreiben. Dadurch können Sie vermeiden, die Vorlage direkt anzurufen.

+0

Entschuldigung für die späte Antwort. Das funktioniert, obwohl ich das Problem ganz vermieden habe, indem ich diesen Teil meiner Bewerbung abstrahiert habe. –