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

使用Node+Express+MySQL新增用户时出现无效状态码致服务器崩溃

问题分析与解决方案

问题根源

  1. 响应方法调用错误:服务器崩溃的直接原因是res.send(result, console.log('added new user successfully'))的用法不符合Express规范。Express的res.send()若传入两个参数,第一个参数会被解析为HTTP状态码,但你传入的result是MySQL返回的OkPacket对象,并非合法的数字状态码,触发ERR_HTTP_INVALID_STATUS_CODE错误;同时console.log()返回undefined,也不符合参数要求。
  2. 错误处理不当:回调中直接throw err会抛出未捕获的异常,一旦数据库操作出错,会直接终止整个服务器进程。
  3. SQL注入风险:使用模板字符串拼接SQL参数,存在严重的SQL注入漏洞,可能导致数据泄露或被恶意篡改。

解决方案

  1. 修正响应发送逻辑:单独调用console.log(),用res.status()设置合法的HTTP状态码(如201表示资源创建成功),再通过res.send()返回响应内容。
  2. 改进错误处理:遇到错误时,通过响应返回错误信息,而非直接抛出异常,确保服务器持续运行。
  3. 使用参数化查询:通过MySQL模块的?占位符传递参数,避免SQL注入。

修正后的代码

app.post('/new/user', (req, res) => {
    const data = { id: req.body.id, name: req.body.name, status: req.body.status };
    console.log("------>>>", req.body.id);

    // 参数化查询,避免SQL注入
    const newUser = 'INSERT INTO users (id, name, status) VALUES(?, ?, ?)';

    connection.query(newUser, [data.id, data.name, data.status], function(err, result) {
        if(err) {
            console.error('添加用户失败:', err);
            return res.status(500).send({ message: '添加用户失败', error: err.message });
        }
        console.log('added new user successfully');
        // 返回创建成功的响应,状态码201
        res.status(201).send({ 
            message: '添加用户成功', 
            affectedRows: result.affectedRows 
        });
    });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:47:24