Node.js中如何通过res.send返回MySQL查询结果至EJS页面?
解决Node.js返回MySQL查询结果并在EJS页面正确渲染的问题
嘿,作为Node.js新手遇到这个问题很正常,我帮你梳理下代码里的几个关键问题,然后给出修正后的方案:
首先看你的代码里存在的几个小问题:
- AJAX请求的语法错误:你在
data参数里写了$('#doct_id').val();,这里多了个分号,会直接导致JavaScript语法错误,请求根本发不出去。 - 路由错误处理缺失响应:数据库查询出错时,你只在控制台打印了错误,但没有给前端返回任何响应,前端会一直处于等待状态,最终超时。
- 前端直接渲染JSON数据的问题:
res.send(rows)返回的是JSON数组,你直接用$('#msg_q').html(data)会把JSON对象转成字符串(比如显示[object Object]),没法正常展示内容。
修正后的完整代码
1. 路由代码(优化错误处理和响应格式)
router.post('/get_doc_msgs', (req, res) => { const queryStr = "SELECT * FROM msgs WHERE d_id = ?"; const queryParams = [req.body.doc_id_msgs]; db.query(queryStr, queryParams, (err, rows) => { if (err) { console.error('数据库查询错误:', err); // 返回500状态码+错误信息,让前端知道出问题了 return res.status(500).json({ error: '加载消息失败,请稍后重试' }); } // 用res.json()更规范地返回JSON格式数据,自动设置正确的响应头 res.json(rows); }); });
2. EJS页面的AJAX函数(修复语法错误+正确渲染数据)
function getmsgs() { $.ajax({ type: 'POST', url: '/get_doc_msgs', // 去掉val()后面的分号,修正语法错误 data: { doc_id_msgs: $('#doct_id').val() }, // 指定响应类型为JSON,避免自动转成字符串 dataType: 'json', success: function(data) { const msgContainer = $('#msg_q'); msgContainer.empty(); // 先清空容器 if (data.length === 0) { msgContainer.html('<p class="no-msg">暂无任何消息</p>'); return; } // 遍历每条消息,生成对应的HTML结构(根据你的表字段调整) data.forEach(msg => { const msgItem = ` <div class="message-item"> <h4>消息内容:${msg.content}</h4> <p class="time">发布时间:${new Date(msg.created_at).toLocaleString()}</p> <!-- 这里可以添加更多你的表字段内容 --> </div> `; msgContainer.append(msgItem); }); }, // 增加错误处理,捕获请求失败的情况 error: function(xhr, status, error) { console.error('请求错误:', error); $('#msg_q').html('<p class="error-msg">加载消息失败,请检查网络或稍后重试</p>'); } }); }
关键修改说明:
- 用
res.json()替代res.send():res.json()会自动设置Content-Type: application/json响应头,确保前端能正确识别为JSON数据,比res.send()更适合返回接口数据。 - 完善错误响应:数据库出错时返回500状态码和友好提示,前端可以捕获并处理,避免用户一直等待。
- 修复AJAX语法错误:去掉多余的分号,保证请求能正常发送。
- 前端遍历渲染数据:不再直接把JSON字符串插入页面,而是遍历每条数据生成HTML结构,这样才能正常展示消息内容。
- 增加前端错误处理:捕获网络错误、服务器错误等情况,给用户友好提示。
内容的提问来源于stack exchange,提问作者CodeBug
相关产品推荐
相关产品推荐

