如何在Node.js和Express上的同一个.ejs文件中呈现来自MySQL查询的多个结果?

3

我现在正在学习Node.js并创建Web应用程序,但不知道如何在同一个.ejs文件上渲染两次。

因此,在下面的.ejs文件中:

<table>
<% rows.forEach(function(ind){ %>
/* map each value of each field to table */
<% }) %>
</table>

<table>
<% rows2.forEach(function(ind){ %>
/* map each value of each field to table */
<% }) %>
</table>

我想执行两个不同的查询并将它们呈现到同一个.ejs文件中,但是当我尝试时,我无法做到,因为在我尝试运行第一个查询并将其呈现到上面的.ejs文件时,我没有第二个查询的结果,它会输出第二个表格(即row2数据)的值。我该怎么处理?还是必须制作两个单独的.ejs文件,并以嵌套形式进行两次呈现?我尽可能地想避免嵌套文件,所以如果有任何解决方案,请告诉我......谢谢。
1个回答

6

等待两个查询都完成后再呈现结果 :)

概念上:

db.query(QUERY1, function(err, result1) {
  db.query(QUERY2, function(err, result2) {
    res.render('template', { rows : result1, rows2: result2 });
  });
});

不要像那样嵌套函数,你可以查看async.parallel,这将使上面的代码看起来像这样:

async.parallel([
  function(callback) { db.query(QUERY1, callback) },
  function(callback) { db.query(QUERY2, callback) }
], function(err, results) {
  res.render('template', { rows : results[0], rows2 : results[1] });
});

使用async.parallel的优点在于两个查询将并行运行,而不像第一个示例中那样按顺序运行。因此,响应时间可能会更快。

我现在在阅读有关“async.parallel”的文档,但它听起来非常适合。谢谢。 - Blaszard
我没有深入阅读文档,但当我尝试时,参数变量 results 返回了一个由行和字段组成的列表嵌套列表。所以我将 rows: result[0] 修改为 rows: result[0][0],得到了我期望的结果。 - Blaszard
@user2360798 哦,对了,我忘记了 node-mysql 会使用两个参数调用回调函数 :) - robertklep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接