如何在 expressjs 4.0 中设置 marko 模板引擎
How to set marko template engine in expressjs 4.0
我想将 marko 模板引擎与 expressjs 4.0 一起使用
当我删除默认的快速模板引擎时,出现以下错误
错误:没有指定默认引擎,也没有提供扩展。
在新视图 (E:\nodeleap\node_modules\express\lib\view.js:48:42)
在 EventEmitter.app.render(E:\nodeleap\node_modules\express\lib\application.js:545:12)
在 ServerResponse.res.render(E:\nodeleap\node_modules\express\lib\response.js:938:7)
在 E:\nodeleap\config\express.js:106:19
在 Layer.handle [作为 handle_request] (E:\nodeleap\node_modules\express\lib\router\layer.js:82:5)
在 trim_prefix(E:\nodeleap\node_modules\express\lib\router\index.js:302:13)
在 E:\nodeleap\node_modules\express\lib\router\index.js:270:7
在 Function.proto.process_params(E:\nodeleap\node_modules\express\lib\router\index.js:321:12)
接下来 (E:\nodeleap\node_modules\express\lib\router\index.js:261:10)
在 Layer.handle [作为 handle_request] (E:\nodeleap\node_modules\express\lib\router\layer.js:78:12)
看来 marko 还不受 express 视图引擎的支持(参见此处:https://github.com/tj/consolidate.js)
编辑: 但是 Marko 常见问题解答建议不要使用快速视图引擎。下面的选项 1 应该有效。
所以我看到了几个选项,1. 直接在你的每条路线中使用 marko 直接渲染你的模板,或者 2. 设置你自己的快速视图引擎,甚至可能 3. 向 [=22= 提交 PR ] 添加 marko 支持,以便其他人可以享受:)
选项 1 和 2 看起来像这样:
var express = require('express');
var app = express();
var fs = require('fs');
var marko = require('marko');
// Option 2
app.engine('marko', function(filePath, options, callback) {
marko.load(filePath).render(options, function(err, output) {
callback(null, output);
});
});
app.set('views', './views');
app.set('view engine', 'marko');
app.get('/viewengine', function(req, res) {
res.render('hello', {
name: 'Frank'
});
});
// Option 1
var template = marko.load(require.resolve('./views/hello.marko'));
app.get('/marko', function(req, res) {
template.stream({
name: 'Frank'
})
.pipe(res);
});
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
更新:
当我回答你的时间是 2019-9-13,并且我使用的是 node v10 LTS,所以我的回答会与上一个 docs 的答案有点不同,但此时它工作正常...
实际上我们不需要为marko设置模板引擎,因为他们添加了一些模块供我们连接到express。这是 documention 建议的最佳方式。
npm install express --save
npm install marko --save
之后创建您的 app.js 文件并执行以下操作:
"use strict";
require("marko/node-require"); // Allow Node.js to require and load `.marko` files
let express = require("express");
let path = require("path");
let markoExpress = require("marko/express");
let template = require("./views/index.marko");
let app = express();
app.set("views", path.join(__dirname, "views"));
app.use(markoExpress()); //enable response.marko(template, data)
app.get("/", (request, response) => {
response.marko(template);
});
app.listen(5000);
在此之后,在您的视图目录中创建您的模板文件,在本例中为 ./views/index.marko
并写下:
$ const name = "world";
<h1>Hello ${name}!</h1>
这是一个简单的 hello world 应用程序,带有 node、express 和 marko
我想将 marko 模板引擎与 expressjs 4.0 一起使用 当我删除默认的快速模板引擎时,出现以下错误
错误:没有指定默认引擎,也没有提供扩展。 在新视图 (E:\nodeleap\node_modules\express\lib\view.js:48:42) 在 EventEmitter.app.render(E:\nodeleap\node_modules\express\lib\application.js:545:12) 在 ServerResponse.res.render(E:\nodeleap\node_modules\express\lib\response.js:938:7) 在 E:\nodeleap\config\express.js:106:19 在 Layer.handle [作为 handle_request] (E:\nodeleap\node_modules\express\lib\router\layer.js:82:5) 在 trim_prefix(E:\nodeleap\node_modules\express\lib\router\index.js:302:13) 在 E:\nodeleap\node_modules\express\lib\router\index.js:270:7 在 Function.proto.process_params(E:\nodeleap\node_modules\express\lib\router\index.js:321:12) 接下来 (E:\nodeleap\node_modules\express\lib\router\index.js:261:10) 在 Layer.handle [作为 handle_request] (E:\nodeleap\node_modules\express\lib\router\layer.js:78:12)
看来 marko 还不受 express 视图引擎的支持(参见此处:https://github.com/tj/consolidate.js)
编辑: 但是 Marko 常见问题解答建议不要使用快速视图引擎。下面的选项 1 应该有效。
所以我看到了几个选项,1. 直接在你的每条路线中使用 marko 直接渲染你的模板,或者 2. 设置你自己的快速视图引擎,甚至可能 3. 向 [=22= 提交 PR ] 添加 marko 支持,以便其他人可以享受:)
选项 1 和 2 看起来像这样:
var express = require('express');
var app = express();
var fs = require('fs');
var marko = require('marko');
// Option 2
app.engine('marko', function(filePath, options, callback) {
marko.load(filePath).render(options, function(err, output) {
callback(null, output);
});
});
app.set('views', './views');
app.set('view engine', 'marko');
app.get('/viewengine', function(req, res) {
res.render('hello', {
name: 'Frank'
});
});
// Option 1
var template = marko.load(require.resolve('./views/hello.marko'));
app.get('/marko', function(req, res) {
template.stream({
name: 'Frank'
})
.pipe(res);
});
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
更新:
当我回答你的时间是 2019-9-13,并且我使用的是 node v10 LTS,所以我的回答会与上一个 docs 的答案有点不同,但此时它工作正常...
实际上我们不需要为marko设置模板引擎,因为他们添加了一些模块供我们连接到express。这是 documention 建议的最佳方式。
npm install express --save
npm install marko --save
之后创建您的 app.js 文件并执行以下操作:
"use strict";
require("marko/node-require"); // Allow Node.js to require and load `.marko` files
let express = require("express");
let path = require("path");
let markoExpress = require("marko/express");
let template = require("./views/index.marko");
let app = express();
app.set("views", path.join(__dirname, "views"));
app.use(markoExpress()); //enable response.marko(template, data)
app.get("/", (request, response) => {
response.marko(template);
});
app.listen(5000);
在此之后,在您的视图目录中创建您的模板文件,在本例中为 ./views/index.marko
并写下:
$ const name = "world";
<h1>Hello ${name}!</h1>
这是一个简单的 hello world 应用程序,带有 node、express 和 marko