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

时间:2016-06-07 12:52:49

标签: javascript sql node.js postgresql

我希望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);
        });
    });
};

3 个答案:

答案 0 :(得分:1)

我之前的回答是基于较旧的代码,不再准确,所以我将其删除了。

您在,password之间错过了逗号CURRENT_TIMESTAMP

我建议您使用parameterized queries而不是像这样自己构建它们。

答案 1 :(得分:1)

密码后缺少逗号,current_Timestamp

周围没有抽搐
"INSERT INTO users (username, email, userpass, datecreated) VALUES" +
    //4 parameters
    "(" + "'" + username + "'" + "," + "'" + email + "'" + "," + "'" + password + "," + "'CURRENT_TIMESTAMP)"

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

答案 2 :(得分:1)

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

Nonononono!

这不是你传递参数的方式,也可能是因为你遇到了问题。 (xQbert指出你也错过了一个逗号)。

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

');--DROP TABLE users;--

啪。 There goes your application

绑定参数parameterized queries用于占位符。这通常被称为准备好的陈述"虽然他们确实有所不同。

e.g。

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

你的问题会消失。

Now read this

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

相关问题