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字段值为空字符串/不可见字符(但你已确认数据库有值,此概率较低)。
具体修复步骤
先确认查询结果结构
在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 }); });针对大小写问题的修复
- 方式一:强制指定别名
修改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>
- 方式一:强制指定别名
配置驱动保留字段大小写
使用mysql驱动时,可在创建连接时添加preserveSqlCase: true配置,强制保留SQL中指定的字段名大小写:const connection = mysql.createConnection({ host: 'localhost', user: 'your_username', password: 'your_password', database: 'your_db', preserveSqlCase: true });调试字段值
若仍有问题,可在EJS中添加调试代码,查看status的原始值:<td> <%= student.status %> <span style="display:none;">调试值: <%= JSON.stringify(student.status) %></span> </td>
内容的提问来源于stack exchange,提问作者Jithendra
相关产品推荐
相关产品推荐

