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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:05:33