使用Node+Express+MySQL新增用户时出现无效状态码致服务器崩溃
问题分析与解决方案
问题根源
- 响应方法调用错误:服务器崩溃的直接原因是
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,也不符合参数要求。 - 错误处理不当:回调中直接
throw err会抛出未捕获的异常,一旦数据库操作出错,会直接终止整个服务器进程。 - SQL注入风险:使用模板字符串拼接SQL参数,存在严重的SQL注入漏洞,可能导致数据泄露或被恶意篡改。
解决方案
- 修正响应发送逻辑:单独调用
console.log(),用res.status()设置合法的HTTP状态码(如201表示资源创建成功),再通过res.send()返回响应内容。 - 改进错误处理:遇到错误时,通过响应返回错误信息,而非直接抛出异常,确保服务器持续运行。
- 使用参数化查询:通过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
相关产品推荐
相关产品推荐

