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&cedil;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 循环来生成正确包装的数据。