Node.js – 将多个对象传递给相同的EJS文件

我有多个MySQL查询结果,我呈现第一个,并使其余的一个可调用作为对象的单个EJS文件(/数据)。

我仅渲染第一个查询结果( obj ),然后让剩下的可调 用到 EJS( rsum_total_salesrsum_count_active

看来,我第一次加载EJS文件,我得到了前500错误

rsum_total_sales is not defined 

但是当我重新加载浏览器时,我得到EJS加载正常,显示从路由文件得到所有需要的结果。

奇怪的事情,即使是第一次,在console.log()我看到,所有三个查询结果已被放在我做的对象,但他们不能被调用的EJS除了第一个直接渲染它。

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

路线文件

 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) 

我没有看到你将rsum_total_salesrsum_count_active发送到前端。 另外,你正在分别运行3个queriessecond个不会等待first一个完成,同样的third个不会等待第二个完成。

只要第一个完成,它会发送数据( obj )回到client(front-end)并不会等待secondthird query完成,因此你不知道你是否得到了front-end所有data

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

尝试这个:

 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 }; console.log(obj); connection.query(qsum_total_sales, function(err, rows, result1) { if (err) { throw err; } else { rsum_total_sales = JSON.parse(rows[0].s_total_price).toFixed(2); console.log(rsum_total_sales); connection.query(qsum_count_active, function(err, rows2, result2) { if (err) { throw err; } else { rsum_count_active = JSON.parse(rows2[0].s_count_active); console.log(rsum_count_active); //After successful completion of all 3 queries send data back to cliend(front-end) //its better to create new obj everytime and send it //store all the data in obj and send back to client var obj = {}; obj.print = result; obj.rsum_count_active = rsum_count_active; obj.rsum_total_sales = rsum_total_sales; res.render('data', obj); } }); } }); } }); });