NodeJS中MySQL查询致应用崩溃问题求助
问题根源
你的代码存在几个核心问题导致应用崩溃:
- 响应提前发送:
res.send("Hallo")在两个异步数据库查询完成前就执行了,后续调用res.cookie时,HTTP响应已经结束,会直接抛出错误。 - SQL注入风险:直接把Cookie中的
id拼进SQL语句,属于高危操作,可能被恶意利用。 - 无错误处理:没处理数据库查询失败、查询结果为空的情况,比如
id不存在时,results[0]是undefined,访问results[0].vorname会直接崩溃。 - 冗余查询:两个查询可以合并成一个,减少数据库请求次数。
- 连接关闭错误:
db.end只是写了方法名,没有调用,而且不该在路由模块里关闭连接,否则后续请求无法使用数据库连接。
修复后的代码
const express = require('express'); const mysql = require('mysql'); const router = express.Router(); const db = mysql.createConnection({ host: "localhost", user: "root", password: "", database: "data" }); db.connect((err) => { if (err) { console.error("数据库连接失败:", err); return; } console.log("数据库连接成功"); }); router.get('/test01', (req, res) => { db.query('SELECT * FROM uebersicht', (err, results) => { if (err) { console.error("查询失败:", err); return res.status(500).send("查询出错"); } res.render("page", { results: results }); }); }); router.get('/test02', (req, res) => { const data = req.cookies.id; if (!data) { return res.status(400).send("缺少id Cookie"); } // 合并查询+参数化防SQL注入 db.query("SELECT vorname, nachname FROM uebersicht WHERE id = ?", [data], (err, results) => { if (err) { console.error("查询失败:", err); return res.status(500).send("查询出错"); } if (results.length === 0) { return res.status(404).send("未找到对应用户"); } const user = results[0]; res.cookie('vorname', user.vorname, { path: '/' }); res.cookie('nachname', user.nachname, { path: '/' }); console.log("Cookie设置完成"); res.send("Hallo"); }); }); module.exports = router; // 不要在这里关闭连接,应用运行期间连接需保持打开 // db.end();
关键修复说明
- 异步流程修正:合并两个查询,确保在数据库返回结果后,再设置Cookie并发送响应,避免响应结束后操作Cookie。
- SQL注入防护:使用
?作为参数占位符,将id放在数组中传递给查询,彻底避免字符串拼接带来的安全风险。 - 完善错误处理:添加连接错误、查询错误的捕获,同时检查查询结果是否为空,防止访问
undefined属性导致崩溃。 - 前置校验:先判断
idCookie是否存在,提前返回错误提示。 - 移除无效连接关闭:删除无效的
db.end,数据库连接应在应用退出时统一关闭,而非路由模块中。
内容的提问来源于stack exchange,提问作者Nik98
相关产品推荐
相关产品推荐

