gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:06:25 27 4
gpt4 key购买 nike

我有多个MySQL查询结果,其中第一个是呈现的,其余的可以作为对象调用到一个EJS文件(/data)。
我只呈现第一个查询结果(obj),然后对EJS调用其余的结果(rsum_total_sales&rsum_count_active)
第一次加载EJS文件时,似乎会出现前端500个错误,如

   rsum_total_sales is not defined

但是当我重新加载浏览器时,EJS可以很好地加载,显示从路由文件获得的所有需要的结果。
奇怪的是,即使是第一次,在console.log()中,我看到所有三个查询结果都被放入了我创建的对象中,但是它们还不能对EJS调用,除了第一个直接呈现给它的结果。
从EJS错误中,我可以看到它传递了第一个connection.query results(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发到哪里去了。另外,您正在单独运行3queries,其中一个将不等待second完成,类似地,另一个将不等待first完成。
一旦第一个完成,它就会将数据(third)发送回obj,并且不会等待client(front-end)secondthird完成,因此您无法知道是否已获得query中的所有data
您应该在第一个回调中执行第二个,在第二个回调中执行第三个,并在成功完成第三个查询后将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);
}
});
}
});
}
});

});

关于mysql - Node.js-将多个对象传递到同一EJS文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41335968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com