如何解决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
相关产品推荐
相关产品推荐

