如何使用Node.js将表单数据写入MySQL数据库表?
实现表单数据写入MySQL数据库的修正方案
先梳理你代码中的核心问题,再给出可运行的修正方案:
1. 修复数据库连接初始化问题
你的myModule.js中全局变量con未被正确赋值,connectToDB方法创建的连接是局部变量,导致调用addUser时con.query会抛出未定义错误;同时创建连接后需要调用connect()建立实际连接。
2. 替换SQL拼接为参数化查询(避免SQL注入)
直接拼接用户输入到SQL语句会引发严重的SQL注入漏洞,必须使用mysql模块原生支持的参数化查询语法。
3. 完善请求处理逻辑
确保服务器启动时初始化数据库连接,同时补充缺失的页面返回逻辑。
修正后的myModule.js
var mysql = require('mysql'); var fs = require('fs'); var con; // 初始化并建立数据库连接 exports.connectToDB = function () { con = mysql.createConnection({ host: "localhost", user: "root", password: "adminps", // SQL密码 database: "project_dev2" }); // 建立实际连接 con.connect(function(err) { if (err) throw err; console.log("已连接到数据库"); }); return con; }; // 使用参数化查询添加用户 exports.addUser = function (res, user_em_id, user_f_name, user_l_name, user_email, user_password, myCallback) { // 用?作为占位符,避免SQL注入 var sql = "INSERT INTO `user` (user_em_id, user_f_name, user_l_name, user_email, user_password) VALUES (?, ?, ?, ?, ?)"; var values = [user_em_id, user_f_name, user_l_name, user_email, user_password]; con.query(sql, values, function (err, result) { if (err) { console.error(err); res.writeHead(500, {'Content-Type': 'text/html'}); res.end("注册失败:" + err.message); return; } myCallback(res, result); }); }; // 注册成功后的页面返回逻辑 exports.navReg = function(res, result) { res.writeHead(200, {'Content-Type': 'text/html'}); res.end(`注册成功!已插入 ${result.affectedRows} 条记录`); }; // 返回注册表单页面 exports.login = function(res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.end('<form action="/register" method="GET">' + '员工ID: <input type="text" name="user_em_id"><br>' + '名字: <input type="text" name="user_f_name"><br>' + '姓氏: <input type="text" name="user_l_name"><br>' + '邮箱: <input type="email" name="user_email"><br>' + '密码: <input type="password" name="user_password"><br>' + '<input type="submit" value="注册">' + '</form>'); };
修正后的server.js
var http = require('http'); var url = require('url'); var fs = require('fs'); var myModule = require('./myModule') var mySess = require('./mySession') var querystring = require('querystring'); // 修复变量声明 // 启动时初始化数据库连接 myModule.connectToDB(); http.createServer(function (req, res) { var body = ''; if (req.url === "/login") { // 登录逻辑保持不变(需自行完善authenticateUser方法) req.on('data', chunk => { body += chunk.toString(); }); req.on('end', () => { body = querystring.parse(body); myModule.authenticateUser(res, body, mySess, myModule.postAuthentication); }); } else if (req.url === "/registration") { // 返回注册表单页面 myModule.login(res); } else if (req.url.indexOf("/register") >= 0) { var q = url.parse(req.url, true).query; // 调用addUser写入数据库 myModule.addUser(res, q.user_em_id, q.user_f_name, q.user_l_name, q.user_email, q.user_password, myModule.navReg); } else { // 默认返回注册表单 myModule.login(res); } }).listen(8080, () => { console.log("服务器运行在 http://localhost:8080"); });
关键注意事项
- 安全警告:GET方法传递密码会导致密码暴露在URL和服务器日志中,强烈建议改成POST方法传递表单数据。
- 密码加密:绝对不要明文存储用户密码,需使用bcrypt等哈希算法加密后再存入数据库。
- 生产环境优化:建议使用数据库连接池(
mysql.createPool)替代单个连接,避免连接耗尽;同时完善错误捕获与日志记录,不要直接抛出错误。
内容的提问来源于stack exchange,提问作者kez
相关产品推荐
相关产品推荐

