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

NodeJS中MySQL查询致应用崩溃问题求助

解决NodeJS+MySQL操作Cookie时应用崩溃的问题

问题根源

你的代码存在几个核心问题导致应用崩溃:

  • 响应提前发送: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();

关键修复说明

  1. 异步流程修正:合并两个查询,确保在数据库返回结果后,再设置Cookie并发送响应,避免响应结束后操作Cookie。
  2. SQL注入防护:使用?作为参数占位符,将id放在数组中传递给查询,彻底避免字符串拼接带来的安全风险。
  3. 完善错误处理:添加连接错误、查询错误的捕获,同时检查查询结果是否为空,防止访问undefined属性导致崩溃。
  4. 前置校验:先判断idCookie是否存在,提前返回错误提示。
  5. 移除无效连接关闭:删除无效的db.end,数据库连接应在应用退出时统一关闭,而非路由模块中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:57:14