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

如何解决Node.js代码运行时抛出错误的问题

报错触发原因

遇到的问题
你当前的报错是ReferenceError: err is not defined,核心由以下几个代码问题共同导致:

  • 错误处理逻辑变量名不匹配:数据库查询回调的入参命名是error,但抛出错误时写的是throw err,err属于未定义变量,这是触发本次报错的直接原因。
  • 执行逻辑顺序错误:res.render() 放在了数据库查询操作之前,无法将查询到的分类数据传递给模板渲染,即使后续查询成功也无法把数据返回给前端。
  • SQL语句直接拼接参数:未做参数校验和预编译处理,既存在SQL注入风险,也会在req.query.id为空/格式非法时直接触发SQL语法错误。
  • 缺少入参校验:未校验req.query.id是否存在、是否为合法数值,请求未带id参数时会直接导致SQL语句异常。
修复方案

以下是修复后的完整可运行代码:

app.get('/cat', function (req, res) {
  // 先做入参合法性校验
  const catID = req.query.id;
  if (!catID || isNaN(Number(catID))) {
    return res.status(400).send('请求参数id不合法');
  }
  console.log('查询的分类ID:', catID);

  // 使用参数化查询避免SQL注入和语法错误
  con.query(
    'SELECT * FROM category WHERE id = ?',
    [catID], // 查询参数放在数组中会被自动转义处理
    function (error, result) {
      // 修正错误变量名,同时做友好错误处理,避免进程直接崩溃
      if (error) {
        console.error('数据库查询失败:', error);
        return res.status(500).send('分类数据查询失败');
      }
      const categoryData = JSON.parse(JSON.stringify(result));
      console.log(categoryData);
      // 数据库查询完成后再渲染模板,将数据传递给页面
      res.render('category', {
        category: categoryData[0] // 查询结果为数组,取对应id的第一条数据
      });
    });
});
额外注意事项
  • 异步回调中不要直接throw错误,Node.js环境下异步抛出的错误无上层捕获时会直接导致服务进程退出,生产环境必须做错误捕获后返回友好响应。
  • 所有用户传入的参数(query、params、请求体字段)都需要先做合法性校验再进入业务逻辑,避免非法输入导致的异常。
  • 所有数据库操作都要使用参数化查询/预编译语句,禁止直接拼接用户输入内容到SQL语句中,防范SQL注入漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:15:00