如何在Node.js(EJS)中正确使用SELECT COUNT(*)统计记录数?
问题排查:页面显示[Object Object]错误无法展示数据库记录数
在开发中需要展示MySQL数据库三个表的记录数,使用Node.js+EJS模板渲染,app.js通过嵌套connection.query执行COUNT查询后将结果传给dashboard.ejs,但页面直接输出变量时显示[Object Object]错误。控制台日志显示查询结果是包含RowDataPacket的数组,尝试resultsd[0]写法仍未解决。
现有代码
app.js 片段
app.get('/dashboard', (req, res) =>{ connection.query('SELECT COUNT(*) FROM dimensions', function(error, resultsd) { if (error) { console.log(error); res.sendStatus(500); return; } connection.query('SELECT COUNT(*) FROM categorias',function(error, resultsc){ if (error){ console.log(error); res.sendStatus(500); return; } connection.query('SELECT COUNT(*) FROM subcategoria',function(error, resultss){ if (error){ console.log(error); res.sendStatus(500); return; } res.render('./dashboard', { resultsd:resultsd, resultsc:resultsc, resultss:resultss }); }) }) }) })
views/dashboard.ejs 相关代码
<h4 class="text-right-mb-0"><%= resultsd %></h4> <h4 class="text-right-mb-0"><%= resultsc %></h4> <h4 class="text-right-mb-0"><%= resultss %></h4>
控制台日志
🚀 ~ file: app.js ~ line 468 ~ q2 ~ resultss [ RowDataPacket { 'COUNT(*)': 5 } ] 🚀 ~ file: app.js ~ line 468 ~ q2 ~ resultsc [ RowDataPacket { 'COUNT(*)': 4 } ] 🚀 ~ file: app.js ~ line 468 ~ q2 ~ resultsd [ RowDataPacket { 'COUNT(*)': 5 } ]
问题原因
每个查询结果是包含单个RowDataPacket对象的数组,该对象的键为COUNT(*),对应值就是表的记录数。直接输出数组或RowDataPacket对象时,EJS会将其转为字符串[Object Object];仅写resultsd[0]输出的仍是对象,依然会显示该错误,必须明确访问对象内的COUNT(*)属性。
解决方案
方案1:修改EJS模板,明确访问属性
把EJS输出语句改为访问数组第一个元素的COUNT(*)属性:
<h4 class="text-right-mb-0"><%= resultsd[0]['COUNT(*)'] %></h4> <h4 class="text-right-mb-0"><%= resultsc[0]['COUNT(*)'] %></h4> <h4 class="text-right-mb-0"><%= resultss[0]['COUNT(*)'] %></h4>
方案2:修改SQL查询,给COUNT结果加别名(更直观)
在SQL中给COUNT(*)设置别名(比如total),简化模板写法:
修改app.js中的查询语句:
// 第一个查询 connection.query('SELECT COUNT(*) AS total FROM dimensions', function(error, resultsd) { // 第二个查询 connection.query('SELECT COUNT(*) AS total FROM categorias',function(error, resultsc){ // 第三个查询 connection.query('SELECT COUNT(*) AS total FROM subcategoria',function(error, resultss){
对应EJS模板改为:
<h4 class="text-right-mb-0"><%= resultsd[0].total %></h4> <h4 class="text-right-mb-0"><%= resultsc[0].total %></h4> <h4 class="text-right-mb-0"><%= resultss[0].total %></h4>
额外优化:避免嵌套回调地狱
当前三层嵌套connection.query会导致回调地狱,代码可读性差,可改用async/await重构:
app.get('/dashboard', async (req, res) => { try { const [resultsd] = await connection.promise().query('SELECT COUNT(*) AS total FROM dimensions'); const [resultsc] = await connection.promise().query('SELECT COUNT(*) AS total FROM categorias'); const [resultss] = await connection.promise().query('SELECT COUNT(*) AS total FROM subcategoria'); res.render('./dashboard', { resultsd: resultsd[0].total, resultsc: resultsc[0].total, resultss: resultss[0].total }); } catch (error) { console.log(error); res.sendStatus(500); } });
此时直接将记录数数值传给模板,EJS可直接输出变量:
<h4 class="text-right-mb-0"><%= resultsd %></h4> <h4 class="text-right-mb-0"><%= resultsc %></h4> <h4 class="text-right-mb-0"><%= resultss %></h4>
内容的提问来源于stack exchange,提问作者Sofia Blanco Sanchez
相关产品推荐
相关产品推荐

