NodeJs中data未定义引用错误求助(附相关代码)
解决Node.js中ReferenceError: data is not defined的问题
我来一步步帮你排查这个问题,核心问题出在路由逻辑的异步处理和参数传递上:
直接触发报错的原因:show路由冗余且错误的渲染调用
在你的show函数里,最后一行直接写了res.render('show')——这会在数据库异步查询完成前就执行渲染,而且完全没传递data参数,这就是show.ejs里报data is not defined的直接原因。
另外,你在查询到结果后执行了res.redirect('/places'),但后面又写了res.render('show'),这会导致尝试发送两次HTTP响应(redirect本身已经是一次响应),这是不符合HTTP规范的,也会打乱你的逻辑流程。
第二个关键问题:places路由无法获取username参数
你的index.js里/places路由没有定义参数:
app.get('/places', loginRequired, routes.places);
但places函数里却尝试获取req.params.username,这会导致username为undefined,数据库查询自然也出问题。
修正后的代码示例
1. 修复routes.js中的show函数
exports.show = function(req, res){ let message = ''; var username = req.params.username; // 建议用参数化查询防止SQL注入,这里先保留你的写法,后面会提优化 const sql="SELECT * FROM `nt_data` WHERE `username`='"+username+"'"; con.query(sql, function(err, result){ console.log(err) // 先处理数据库查询错误 if(err) { message = "查询数据出错!"; return res.render('show.ejs',{data:[], message: message}); } if(result.length <= 0){ message = "未找到相关内容!"; res.render('show.ejs',{data:result, message: message}); } else { // 重定向到带username参数的places路由(需要先修改index.js的路由) res.redirect(`/places/${username}`); } }); // 移除这里冗余的res.render('show') };
2. 修改index.js中的places路由,添加参数
app.get('/places/:username', loginRequired, routes.places);
3. 修复routes.js中的places函数
exports.places=function (req,res){ let message = ''; var username = req.params.username; const sql="SELECT * FROM `nt_data` WHERE `username`='"+username+"'"; con.query(sql, function(err, result){ console.log(err) if(err) { message = "查询数据出错!"; return res.render('places.ejs',{data:[], message: message}); } if(result.length <= 0){ message = "未找到相关地点!"; } res.render('places.ejs',{data:result, message: message}); }); }
额外重要优化:防止SQL注入
你的SQL语句用了字符串拼接WHERE username='"+username+"',这存在严重的SQL注入风险,建议立刻改成参数化查询:
// 用?作为占位符,把参数放在数组里传递 const sql="SELECT * FROM `nt_data` WHERE `username`=?"; con.query(sql, [username], function(err, result){ // 后续逻辑不变 });
这样可以避免恶意用户通过构造特殊username来攻击你的数据库。
内容的提问来源于stack exchange,提问作者user14398337
相关产品推荐
相关产品推荐

