Noje.js EJS 数据库调用
Noje.js EJS Database call
来自 JAVA 的背景,我发现 EJS 很有趣。但是,我似乎无法弄清楚如何在循环时从不同的函数中获取对象。在下面的示例中,我试图在 ReadingLog 中调用一个名为 chapters 的异步函数,该函数查询数据库和 returns 每本书的章节:
<%
entries.forEach(function(i){
let chapters = await ReadingLog.chapters(i.book_uid);
total_mins=parseFloat(total_mins)+parseFloat(i.minutes);
console.log('Date:'+i.date.toDate().toISOString());
let tzdate = datetimeutil.converttz(i.date.toDate(),"America/Montreal");
let mdate = datetimeutil.convert_to_str(i.date.toDate());
%>
<tr>
<td><%= mdate %></td>
<td><%= i.book_title %></td>
<td>
<% if(i.language!=null && i.language == "fr"){ %>Fran&c¸ais<% } %>
<% if(i.language!=null && i.language == "en"){ %>English<% } %>
<% if(i.language!=null && i.language == "es"){ %>Español<% } %>
</td>
%>
想在 EJS 中实现它吗?
谢谢
永远不要在 EJS 中“让事情发生”,那不是它的工作。您在 Node.js 代码中准备好所有数据,然后将其作为模板上下文传递给 EJS,以便将其模板化。
所以在这种情况下:在节点端获取 chapters
数据,然后 呈现响应:
app.get(`whatever`, ..., async (req, res) => {
const entries = wherever.this.comesFrom();
// first, prep all your data for templating
const data = await Promise.all(
entries.map((entry, i) => {
return new Promise(resolve => {
const chapter = await ReadingLog.chapters(id);
const totalMins = ...;
...
resolve({ i, chapter, totalMins, ... });
});
});
// then just pass that data to your templating engine of choice.
res.render(`yourtemplate.html`, { entries: data });
});
然后 EJS 只需要遍历 entries
并盲目地将值写入您的模板,最多使用一些 for 循环来生成正确包装的数据。
来自 JAVA 的背景,我发现 EJS 很有趣。但是,我似乎无法弄清楚如何在循环时从不同的函数中获取对象。在下面的示例中,我试图在 ReadingLog 中调用一个名为 chapters 的异步函数,该函数查询数据库和 returns 每本书的章节:
<%
entries.forEach(function(i){
let chapters = await ReadingLog.chapters(i.book_uid);
total_mins=parseFloat(total_mins)+parseFloat(i.minutes);
console.log('Date:'+i.date.toDate().toISOString());
let tzdate = datetimeutil.converttz(i.date.toDate(),"America/Montreal");
let mdate = datetimeutil.convert_to_str(i.date.toDate());
%>
<tr>
<td><%= mdate %></td>
<td><%= i.book_title %></td>
<td>
<% if(i.language!=null && i.language == "fr"){ %>Fran&c¸ais<% } %>
<% if(i.language!=null && i.language == "en"){ %>English<% } %>
<% if(i.language!=null && i.language == "es"){ %>Español<% } %>
</td>
%>
想在 EJS 中实现它吗?
谢谢
永远不要在 EJS 中“让事情发生”,那不是它的工作。您在 Node.js 代码中准备好所有数据,然后将其作为模板上下文传递给 EJS,以便将其模板化。
所以在这种情况下:在节点端获取 chapters
数据,然后 呈现响应:
app.get(`whatever`, ..., async (req, res) => {
const entries = wherever.this.comesFrom();
// first, prep all your data for templating
const data = await Promise.all(
entries.map((entry, i) => {
return new Promise(resolve => {
const chapter = await ReadingLog.chapters(id);
const totalMins = ...;
...
resolve({ i, chapter, totalMins, ... });
});
});
// then just pass that data to your templating engine of choice.
res.render(`yourtemplate.html`, { entries: data });
});
然后 EJS 只需要遍历 entries
并盲目地将值写入您的模板,最多使用一些 for 循环来生成正确包装的数据。