如何在Node.js和Express中以嵌套forms呈现多个.ejs文件?

我怎样才能以嵌套的forms呈现多个.ejs文件?

所以我有一个以下文件:

 var mysql = require('mysql'); var ejs = require('ejs'); exports.index = function(req, res){ if (req.method=='POST'){ var connection = mysql.createConnection({user:'root', password:'root', database:'testdb'}); var name = req.param('name'); connection.query('select * from table_name where name = ?', name, function(err, rows, fields){ if(err) throw err; res.render('index', { title: 'title', content: res.render('index2', {data:rows}) }); }); } }); 

其中index.ejs由非常基本的html标记(比如html,head,body和一个p标记)组成,并且其中包含<%- content %> ,其中内容假定由另一个.ejs文件呈现,包括html,head或body标签,并且只被假定为呈现内容和标题。 但是,当我通过POST请求访问这个文件并试图渲染文件,然后从浏览器中检出输出的HTML文件时,内容只包含index2.ejs文件,这意味着它没有html,body,head标签。

那么我错过了什么? 如果我想通过<script src='some_file.js'></script>包含一个javascript库,当我尝试在index2.ejs文件中渲染时,是否应该添加其他渲染属性…对吗?

谢谢。

首先,我认为你对res.render如何运作感到困惑。 根据文件 :

res.render(view,[locals],callback)

用渲染的string回应callback视图。

这就解释了为什么你只能在HTML页面看到index2.ejs的内容。


现在,有多种方法可以实现您的目标,即在视图中嵌套视图。 从Express 3.x开始,您需要使用include 。在这种情况下,您可以像这样重写您的视图:
1-定义一个header.ejs文件,看起来像这个例子 。
2-定义一个footer.ejs。 这看起来就像这个其他的例子 。
3-在你的index2.ejs中,包含这两个文件,像这样:

 <% include header %> //The HTML of your index2.ejs //You can add some reusable views, like, say, a submit button above the footer <% include reusable_views/submit %> <% include footer %> 

第二种方法是使用ejs-locals ,它允许你通过只指定它们的path插入任何视图:

 res.render('index', { title: 'title', content: 'index2', data:rows }); 

而且,在您的index1.ejs中,您将拥有:

 <html><head> <title><%= title %></title></head> <body><p> <%- partial('index2',{}) %> </p></body></html> 

这种方法的优点是你可以使用额外的对象来传递额外的值给你的视图。 查看ejs-locals的github页面了解更多详情。

以及标准的HTML,如headfootersidebars或任何..有Partials这个例子解释了一切..