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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:48:31