You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:20:31