Node.js - 将多个对象传递给同一个EJS文件

时间:2016-12-26 20:25:26

标签: mysql node.js express ejs

我有多个MySQL查询结果,其中我渲染第一个,并将其余的可调用作为对象的单个EJS文件(/ data)。

我只渲染第一个查询结果( obj ),然后我将其余部分调用到EJS( rsum_total_sales & rsum_count_active

似乎第一次加载EJS文件时,我得到前端500错误,如

   rsum_total_sales is not defined

但是当我重新加载浏览器时,我让EJS加载正常,显示从路径文件中获得的所有必需结果。

奇怪的是,即使是第一次,在console.log()中我看到所有三个查询结果都已放入我制作的对象中,但是除了第一个直接渲染到EJS之外,它们还无法调用到EJS它

从EJS错误中我可以看到它传递了第一个connection.query结果(obj),它被呈现但不是其余两个(rsum_total_sales& sum_count_active),我只是让它们的对象可以调用,直到我重新加载浏览器。 / p>

路线档案

var obj = {};
var qsum_total_sales = 'SELECT SUM (total_price) AS s_total_price FROM myrecords'; 
var qsum_count_active = 'SELECT COUNT (*) AS s_count_active FROM myrecords WHERE NOT status = "canceled" ';
var qdata = 'SELECT * FROM myrecords';

router.get('/data', function(req, res){
    connection.query(qdata, function(err, result) {
        if(err){
            throw err;
           } else {
                obj = {print: result};
                res.render('data', obj);
                console.log(obj);
        }
    });

   connection.query(qsum_total_sales, function(err, rows, result) {
       if(err){
           throw err;
       } else {
           rsum_total_sales = JSON.parse(rows[0].s_total_price).toFixed(2);
           console.log(rsum_total_sales); 
           //First time prints result but it can't be called to EJS until reloading EJS
       }
   });

  connection.query(qsum_count_active, function(err, rows, result) {
       if(err){
           throw err;
       } else {
           rsum_count_active = JSON.parse(rows[0].s_count_active);
           console.log(rsum_count_active);  
           //First time prints result but it can't be called to EJS until reloading EJS
       }
   }); 
});

EJS档案

<tbody>
    <% print.forEach(function (datatable) { %>
        <tr>
             <td><%= datatable.id %></td
             <td><%= datatable.full_name %></td>
             //rest of loop
         </tr>                              
        <% }) %>
</tbody>
    // some html code
<h4>Total sales sum is: <%- rsum_total_sales %></h4>
<h4>Total active records are: <%- rsum_count_active %></h4>

前端错误(仅当EJS第一次加载到浏览器时)

ReferenceError: C:\NodeJS\CRUD-1\views\data.ejs:39
    37|         </table>
    38|         <hr/>
>>  39|         <h4>Total sales sum is: <%- rsum_total_sales %></h4>
    40|         <h4>Total active records are: <%- rsum_count_active %></h4>

rsum_total_sales is not defined
at eval (eval at <anonymous> (C:\NodeJS\CRUD-1\node_modules\ejs\lib\ejs.js:481:12),
<anonymous>:47:17)
at returnedFn (C:\NodeJS\CRUD-1\node_modules\ejs\lib\ejs.js:512:17)
at View.exports.renderFile [as engine] (C:\NodeJS\CRUD- 1\node_modules\ejs\lib\ejs.js:364:31)
at View.render (C:\NodeJS\CRUD-1\node_modules\express\lib\view.js:126:8)
at tryRender (C:\NodeJS\CRUD-1\node_modules\express\lib\application.js:639:10)
at EventEmitter.render (C:\NodeJS\CRUD-1\node_modules\express\lib\application.js:591:3)
at ServerResponse.render (C:\NodeJS\CRUD-1\node_modules\express\lib\response.js:960:7)
at Query._callback (C:\NodeJS\CRUD-1\routes\data.js:36:17)
at Query.Sequence.end (C:\NodeJS\CRUD-1\node_modules\mysql\lib\protocol\sequences\Sequence.js:86:24)
at Query._handleFinalResultPacket (C:\NodeJS\CRUD-1\node_modules\mysql\lib\protocol\sequences\Query.js:144:8)

1 个答案:

答案 0 :(得分:2)

我不知道您将rsum_total_salesrsum_count_active发送到前端的位置。此外,您分别运行3 queriessecond不会等待first一个完成,同样third不会等待第二个完成。

第一个完成后,它会将数据(obj)发送回client(front-end),并且不会等待secondthird {{1}完成,因此你不知道你是否得到了query中的所有data

你应该在第二个回调中的第一个和第三个回调中做第二个,并在成功完成第三个查询后将obj发送到前端。这样您就可以确保所有数据都是前端的。

试试这个:

front-end