【问题标题】:MySQL inserting a new user into a database using nodejsMySQL使用nodejs将新用户插入数据库
【发布时间】:2025-11-26 05:25:01
【问题描述】:

我正在尝试使用 nodejs 和 mysql 注册一个新用户。我对 mysql 语法不是很熟悉,所以我可能做错了什么,但这就是我所拥有的:

app.post('/createNewUser', (req, res) => {
  let newUsername = req.body.newUsername;
  let newPassword = req.body.newPassword;
  let newData = 'INSERT INTO users (username, password) VALUES (newUsername, newPassword)';
  db.query(newData, function(err, result) {
    if (err) throw err;
    console.log('New user registered');
  });
});

它给我的错误是“字段列表中的未知列'newUsername',它说该变量从未使用过,所以我假设它正在将它作为字符串读取?但我不确定如何通过它作为那个变量而不是在引号内。

【问题讨论】:

  • 查看您正在使用的 MySQL 连接库的文档。它告诉您如何使用参数化查询/如何将参数放入查询中。 (警告:不要进行字符串连接;more here。)
  • 查看文档时我仍然很困惑,不确定我是否找对了地方:github.com/mysqljs/mysql

标签: javascript mysql node.js


【解决方案1】:

根据the documentation for the module you referred to,应该是这样的:

let newData = 'INSERT INTO users (username, password) VALUES (?, ?)';
//                                              Placeholders −^−−^
db.query(newData, [newUsername, newPassword], function(err, result) {
//                ^^^^^^^^^^^^^^^^^^^^^^^^^^^−− Values for them
  if (err) throw err;
  console.log('New user registered');
});

或者像这样(你可以选择):

let newData = 'INSERT INTO users (username, password) VALUES (?, ?)';
//                                              Placeholders −^−−^
db.query({
    sql: newData,
    values: [newUsername, newPassword]
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^−−−−−−−−− Values for them
}, function(err, result) {
  if (err) throw err;
  console.log('New user registered');
});

这是一种相当常见的模式,使用 ? 将值放在其中,然后在数组中单独提供值或使用某种索引。 (在我看来,这不是最好的方法,但如果这是您正在使用的模块...)

我更喜欢占位符有名字,我可能会使用这样的函数将名字转换为?

function doQuery(options, callback) {
    let {sql, parameters, ...rest} = options;
    const values = [];
    for (const name in parameters) {
        sql = sql.replace(":" + name, "?");
        values.push(parameters[value]);
    }
    db.query({sql, values, ...rest}, callback);
}

然后你会这样使用它:

doQuery({
    sql: 'INSERT INTO users (username, password) VALUES (:newUsername, :newPassword)',
    parameters: {newUsername, newPassword}
}, function(err, result) {
    if (err) {
        // Handle/report error
    } else {
        console.log('New user registered');
    }
});

旁注:if (err) throw err; 通常是带有 Node.js 回调的反模式。您在调用回调的代码中抛出错误,而不是在您的 自己的 代码中。最好有一种处理/报告错误的方法。

【讨论】:

  • 是的,成功了!是的,我开始意识到 node js 可能不是与 mysql 一起使用的最佳选择,但我认为先学习 sql 数据库比先学习 nosql 更有帮助。感谢您的帮助!
  • @john4ster - Node.js 非常适合与 MySQL 对话,但有一些模块可以做到这一点。我已经稍微更新了答案,以展示我如何在该答案周围放置一个包装器,以减少使用? 的错误机会。 :-)