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

EJS渲染问题:MySQL查询返回的状态列值无法显示

问题描述

我使用Node.js、MySQL和EJS构建学生管理系统,需要在表格中展示学生列表及其状态值,但状态列未显示任何内容,尽管数据库中存在对应数据。直接在MySQL中执行查询语句可正常返回status值,但页面上该列始终为空。相关代码如下:

MySQL 查询语句

SELECT s.stuNIC as NIC, s.stuUserName as username, u.intendedMajor, u.status
FROM student s 
JOIN university_registration u ON s.stuNIC = u.NIC;

EJS 模板(uni-view-student.ejs)

<% data.forEach(function(student) { %>
    <tr onclick="window.location.href='/uni-notification/<%= student.NIC %>'">
        <td><%= student.NIC %></td>
        <td><%= student.username %></td>
        <td><%= student.intendedMajor %></td>
        <td><%= student.status %></td> <!-- 此处无内容显示 -->
    </tr>
<% }); %>

Node.js 代码(server.js)

app.get('/uni-view-student', (req, res) => {
    const query = `
        SELECT s.stuNIC as NIC, s.stuUserName as username, u.intendedMajor, u.status
        FROM student s 
        JOIN university_registration u ON s.stuNIC = u.NIC
    `;
    connection.query(query, (err, results) => {
        if (err) {
            console.error('Error querying the database:', err);
            return res.status(500).send('Database query error');
        }
        res.render('uni-view-student', { data: results });
    });
});

原因与修复方案

核心原因排查

最常见的问题是字段名大小写不匹配:MySQL在Windows系统下默认不区分字段名大小写,但Node.js的MySQL驱动(如mysql/mysql2)会严格保留数据库字段的原始大小写。例如,若数据库中university_registration表的状态字段是大写STATUS,查询时写u.status虽能返回数据,但驱动返回的结果对象中该字段键为STATUS,而EJS模板中使用的是小写student.status,导致无法取值。

此外,也可能是驱动默认将字段名转为小写,或status字段值为空字符串/不可见字符(但你已确认数据库有值,此概率较低)。

具体修复步骤

  1. 先确认查询结果结构
    在Node.js查询回调中添加日志,打印返回的结果,明确字段名和对应值:

    connection.query(query, (err, results) => {
        if (err) {
            console.error('Error querying the database:', err);
            return res.status(500).send('Database query error');
        }
        console.log('查询结果:', results); // 打印结果确认字段名
        res.render('uni-view-student', { data: results });
    });
    
  2. 针对大小写问题的修复

    • 方式一:强制指定别名
      修改MySQL查询语句,给u.status指定明确的小写别名,确保与EJS模板中的键一致:
      SELECT s.stuNIC as NIC, s.stuUserName as username, u.intendedMajor, u.status AS status
      FROM student s 
      JOIN university_registration u ON s.stuNIC = u.NIC;
      
    • 方式二:调整EJS模板字段名
      如果日志显示结果中的字段是大写STATUS,直接修改EJS模板:
      <td><%= student.STATUS %></td>
      
  3. 配置驱动保留字段大小写
    使用mysql驱动时,可在创建连接时添加preserveSqlCase: true配置,强制保留SQL中指定的字段名大小写:

    const connection = mysql.createConnection({
      host: 'localhost',
      user: 'your_username',
      password: 'your_password',
      database: 'your_db',
      preserveSqlCase: true
    });
    
  4. 调试字段值
    若仍有问题,可在EJS中添加调试代码,查看status的原始值:

    <td>
      <%= student.status %>
      <span style="display:none;">调试值: <%= JSON.stringify(student.status) %></span>
    </td>
    

内容的提问来源于stack exchange,提问作者Jithendra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:05:00