Node.js – 将多个对象传递给相同的EJS文件
我有多个MySQL查询结果,我呈现第一个,并使其余的一个可调用作为对象的单个EJS文件(/数据)。
我仅渲染第一个查询结果( obj ),然后让剩下的可调 用到 EJS( rsum_total_sales & rsum_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_sales
和rsum_count_active
发送到前端。 另外,你正在分别运行3个queries
, second
个不会等待first
一个完成,同样的third
个不会等待第二个完成。
只要第一个完成,它会发送数据( obj
)回到client(front-end)
并不会等待second
和third
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); } }); } }); } }); });