NodeJS + PostgreSQL:INSERT 的目标列多于表达式



我想INSERT每个新用户注册时CURRENT_TIMESTAMP的当前时间戳。列号等于 VALUES 中的参数数。然而我得到INSERT has more target columns than expressions.使用 node-postgres npm 模块作为控制器。

                         //Just 3 parameters, timestamp is hardcoded in the query
exports.create = function (username, email, password) {
    DB.connect(connection, function (err, client, done) {
        var query = client.query(
    //4 columns 
    "INSERT INTO users (username, email, userpass, datecreated) VALUES" +
    //4 parameters
    "(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')");
        query.on('error', function (error) {
            console.log("query returned an " + error);
        });
        query.on('row', function (row, result) {
            result.addRow(row);
        });
    });
};

密码后缺少逗号,周围没有current_Timestamp抽动

"INSERT INTO users (username, email, userpass, datecreated) VALUES" +
    //4 parameters
    "(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "," + "'CURRENT_TIMESTAMP)"

--- 虽然这可能是解决当前问题的公认答案,但我强烈建议评估克雷格和拉尔斯的答案。 使用参数是一种更好的长期方法,因为它更安全;实际上,一旦您了解了如何编码,以及正确的现代范式,就更容易编码。

我之前的答案是基于旧提供的代码,它不再准确,所以我删除了它。

您在 passwordCURRENT_TIMESTAMP 之间缺少逗号,

我建议您使用参数化查询,而不是像这样自己构建它们。

`"(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "'" + "'CURRENT_TIMESTAMP')"`

诺诺!

这不是您传递参数的方式,也可能是您遇到问题的原因。(xQbert指出你也缺少一个逗号)。

想象一下,如果我输入用户名

');--DROP TABLE users;--

啪。您的应用程序在那里。

通过将参数绑定占位符来使用参数化查询。这通常被称为"预处理语句",尽管它们实际上是不同的东西。

例如

client.query(
    "INSERT INTO users (username, email, userpass, datecreated) VALUES ($1, $2, $3, current_timestamp)",
    [username, email, password])

你的问题会消失。

现在阅读此内容。

请注意,这不仅是一个安全问题,也是一个错误,即使来自非恶意用户也会导致错误。我输入了一个看起来很安全的密码,例如94/Ql@$'B'wC。繁荣,您的应用程序因数据库错误而崩溃。

最新更新