Node JS中的简单路由和不显眼的模板引擎

这是一个多部分的问题,我是一个完整的新手节点,所以请温柔:)

我有一个非常简单的节点/快速应用程序设置返回一个index.html而不使用路由…

var app = express(); var port = process.env.PORT || 1337; app.use('/i', express.static(__dirname + '/i')); app.use('/Stylesheets', express.static(__dirname + '/Stylesheets')); app.use(express.static(__dirname)); app.listen(port); console.log('listening on port ' + port); 

index.html作为静态文件提供。

我的下一个工作是开始返回几个页面的正确的路由,我已经得到了尽可能远的工作,我需要把我的路由在routes.js文件和“要求”该文件在我的server.js文件,但我可以不要在设置路线的时候让我头脑发热,而且我在网上看到的每个示例/演示似乎都以不同的方式进行。 任何明确的例子,如何做到这一点真的不胜感激。

接下来的问题是,我想包括dynamic页面,但不知道模板引擎到哪里去。 我想使用“不显眼”的东西,这样我的原始HTML文件在浏览器中查看时仍然有意义。

在前端,我只是简单地将HTML注入到页面中,首先使用select器,然后使用.html()方法来更改html,我可以将JSON数据绑定到模板,然后将其注入到正确的位置一个类名等。这将是完全不引人注目,不会需要任何丑陋的{}括号,内嵌的JavaScript或指令。 伪代码…

 var data = {"name":"John"}; var result = templateEngine.bind("/template.html", data) $('.person').html(result); 

这样,我可以保持我原来的HTML清洁和可见,像这样…

 <div class="person"> My Name is FirstName </div> 

我能find的最接近的东西是PURE – http://beebole.com/pure-但是我不确定如何使它与NODE一起工作(或者即使它兼容)。

为了增加更多的复杂性,无论我使用什么模板引擎,都需要能够使用子模板(partials),这样我可以在每个页面上包含一个页眉/页脚等。 我认为这可以通过从每个主模板中的需要的地方引用子模板recursion地完成?

如果你仍然在阅读这个,那么很明显,你会发现,我在这里用一种新技术来解决问题,任何帮助都会非常感谢!

但我无法绕开设置路线,我在网上看到的每个示例/演示似乎都以不同的方式进行。 任何明确的例子,如何做到这一点真的不胜感激。

不清楚你在例子中看到了什么不同,但总的模式是这样的:

 app.**[HTTP VERB]**(**[URL]**, function(req, res){ res.end('<html>hello world</html>'); }); 

以下代码将接受所有对您的网站的根url的HTTP GET请求:

 app.get('/', function(req, res){ res.end('<html>hello world</html>'); }); 

虽然下面的代码将接受所有的HTTP GET请求到您的网站/testing

 app.get('/test', function(req, res){ res.end('<html>hello world from the test folder</html>'); }); 

有一个单独的HTTP POST请求路由(例如,当用户提交数据回到服务器)是很常见的。 在这种情况下,HTTP动词是POST,如下例所示。

 app.post('/test', function(req, res){ res.end('<html>Thanks for submitting your info</html>'); }); 

在这种情况下,我直接embedded代码来处理请求,而不是引用外部routes.js,只是为了使这个问题更清晰。 在一个真正的应用程序中,你可以通过引用一个外部函数来实现,这样你的app.js保持精简和清洁。

 app.get('/test', routes.NameOfFunctionToHandleGetForSlashTest); app.post('/test', routes.NameOfFunctionToHandlePostForSlashTest); 

我知道这是一个老问题,但最近我已经探讨了这个话题,并提出了以下解决scheme:

我原来的问题

我在ejs上放置了以下configuration:

  var ejs = require('ejs'); server.configure(function(){ server.set("view options", {layout: false}); server.engine('html', require('ejs').renderFile); server.use(server.router); server.set('view engine', 'html'); server.set('views', __dirname + "/www"); }); 

这将您的视图引擎设置为ejs,您的视图目录作为您的静态公共html目录,并告诉ejs处理.html文件,而不是.ejs。

路线可以是这样的句柄:

  server.all("*", function(req, res, next) { var request = req.params[0]; if((request.substr(0, 1) === "/")&&(request.substr(request.length - 4) === "html")) { request = request.substr(1); res.render(request); } else { next(); } }); server.use(express.static(__dirname + '/www')); 

这将通过视图引擎路由所有html请求,并将所有其他请求通过堆栈传递为静态文件。

你的html现在可以看起来像这样:

  <%include head.html%> <%include header.html%> <p class="well">Hello world!</p> <%include footer.html%> 

你可以嵌套包含,并将variables传递给你的包含。 所以,例如你的包头可以打电话给:

  <title> <%= title %> </title> 

并在您的索引页面的顶部,您可以包括一个对象,如:

  {var title: "Home"} 

无论如何,也许这将帮助谁正在寻找一个超简单的方法来处理包括正常的HTML粘连。