Node.js &引用;错误";:&引用;“枚举”的输入值无效;仅当在应用程序中使用pg包执行INSERT SQL操作时
我开始构建应用程序的用户身份验证部分,并使用PostgreSQL作为数据库。我在PG中设置了一个表,代码如下。这是我用来设置Node.js &引用;错误";:&引用;“枚举”的输入值无效;仅当在应用程序中使用pg包执行INSERT SQL操作时,node.js,postgresql,enums,pg,enumerated-types,Node.js,Postgresql,Enums,Pg,Enumerated Types,我开始构建应用程序的用户身份验证部分,并使用PostgreSQL作为数据库。我在PG中设置了一个表,代码如下。这是我用来设置USERS表的代码。当我在psql控制台中执行insert操作时,一切正常。但是,当我在我的NodeJS应用程序中执行此操作时,它使用pgnpm包,并通过客户端实例查询数据库,无法正常工作 DROP EXTENSION IF EXISTS pgcrypto; DROP TYPE IF EXISTS genderEnum; DROP TYPE IF EXISTS
USERS
表的代码。当我在psql
控制台中执行insert
操作时,一切正常。但是,当我在我的NodeJS应用程序中执行此操作时,它使用pg
npm包,并通过客户端实例查询数据库,无法正常工作
DROP EXTENSION IF EXISTS pgcrypto;
DROP TYPE IF EXISTS genderEnum;
DROP TYPE IF EXISTS roleEnum;
-----------------------------------------------
CREATE OR REPLACE FUNCTION trigger_set_timestamp()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-----------------------------------------------
DROP EXTENSION IF EXISTS pgcrypto;
CREATE EXTENSION pgcrypto;
-----------------------------------------------
CREATE TYPE genderEnum AS ENUM ('male', 'female', 'other');
CREATE TYPE roleEnum AS ENUM ('banned', 'suspended', 'member', 'admin', 'developer');
-----------------------------------------------
CREATE TABLE users
(
id serial NOT NULL PRIMARY KEY,
username varchar(33) NOT NULL UNIQUE,
password varchar(255) NOT NULL,
date_of_birth date NOT NULL,
gender genderEnum NOT NULL,
created_at timestamptz NOT NULL DEFAULT NOW(),
updated_at timestamptz NOT NULL DEFAULT NOW(),
role roleEnum NOT NULL DEFAULT 'member',
description text,
image jsonb,
friends jsonb
);
-----------------------------------------------
CREATE TRIGGER set_timestamp
BEFORE UPDATE ON users
FOR EACH ROW
EXECUTE PROCEDURE trigger_set_timestamp();
命令行(成功)尝试:
INSERT INTO USERS ( username, password, date_of_birth, gender, role, description, friends ) VALUES ( 'Amy', '123456', '02/24/1975', 'female', 'member', 'I am a fun girl.', '["Jack", "Suzie"]' );
INSERT 0 1
SELECT * FROM USERS WHERE username = 'Amy';
id | username | password | date_of_birth | gender | created_at | updated_at | role | description | image | friends
----+----------+----------+---------------+--------+-------------------------------+-------------------------------+--------+------------------+-------+-------------------
9 | Amy | 123456 | 1975-02-24 | female | 2019-08-17 03:19:34.518501-04 | 2019-08-17 03:19:34.518501-04 | member | I am a fun girl. | | ["Jack", "Suzie"]
(1 row)
节点代码(未成功)尝试 下面是我目前用于此查询的NodeJS代码。我有一个异步/等待函数包装在POST方法中。我正在对
req.body
中的值进行解构,然后将它们作为参数插入SQL查询中,以代替$1、$2、$3…等
,以及非所需的值(如说明
、图像
和好友
),我有一个类似于friends | | null
的声明作为预防措施(我不是100%确定是否需要)。我也有一些基本的错误处理正在进行,但这只是我有一些东西。我会在时机成熟时更新它,它对应用程序更为重要
router.post("/register", async (req, res) => {
const date = new Date();
const loggableDate = date.toLocaleDateString();
const loggableTime = date.toLocaleTimeString();
const { username, password, date_of_birth, gender, role, description, image, friends } = req.body;
console.log("\nBODY", req.body, "\n");
try {
const user = await database.query(`INSERT into
USERS (
username,
password,
date_of_birth,
gender,
role,
description,
image,
friends
)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, [
[username],
[password],
[date_of_birth],
[gender],
[role],
[description || null],
[image || null],
[friends || null]
]
);
if (!user) {
return res.status(404).json({ message: errors.clientSideError404, date: loggableDate, time: loggableTime });
}
return res.status(200).json(newUser.rows[0]);
} catch (error) {
return res.status(500).json({ error: error.stack, date: loggableDate, time: loggableTime });
}
});
上述节点代码的结果:
{
"error": "error: invalid input value for enum genderenum: \"{\"female\"}\"\n at Connection.parseE (/Users/JON-DOE/Desktop/virtual-desktop/Work/app/node_modules/pg/lib/connection.js:604:11)\n at Connection.parseMessage (/Users/JON-DOE/Desktop/virtual-desktop/Work/app/node_modules/pg/lib/connection.js:401:19)\n at Socket.<anonymous> (/Users/JON-DOE/Desktop/virtual-desktop/Work/app/node_modules/pg/lib/connection.js:121:22)\n at Socket.emit (events.js:203:13)\n at addChunk (_stream_readable.js:294:12)\n at readableAddChunk (_stream_readable.js:275:11)\n at Socket.Readable.push (_stream_readable.js:210:10)\n at TCP.onStreamRead (internal/stream_base_commons.js:166:17)",
"date": "8/17/2019",
"time": "3:44:51 AM"
}
我希望找出我在使用这种枚举器类型时的错误。我想这与我用PostMan输入数据的方式有关,因为psql
控制台工作得很好。如果这篇文章冗长,请原谅我。我对后端编程相当陌生,所以我在这里接受了很多信息,非常感谢有人的帮助。为了记录在案,用户的密码将与JWTs一起使用bCryptJS进行加密,但现在,我只是想让一个简单的插入工作
谢谢大家! 取消引用后出现的错误:
error: invalid input value for enum genderenum: "{"female"}"
看起来您尝试插入的值不是female
,而是{“female”}
。注意:
=> create temporary table test (a genderEnum);
=> insert into test values ('female');
INSERT 0 1
=> insert into test values ('{"female"}')
ERROR: invalid input value for enum genderenum: "{"female"}"
因此,看起来您的数据并不是您认为的那样。数据似乎就在查询之外。这就像查询将其添加到JSON字符串化对象中一样。这是在进入查询之前的console.log<代码>正文{用户名:'Amy',密码:'123456',出生日期:'02/24/1957',性别:'female',角色:'member',描述:'我是一个有趣的女孩',朋友:['Jack','Suzie']}我想知道是不是参数化输入造成了这个问题,b/c当我用字符串文本内联SQL变量时,我可以执行插入操作,但这会使我的应用程序面临SQL注入的风险,不幸的是:(我会尝试创建一个只连接到db的SSCCE,并执行插入,看看是否有效。我不是NodeJS开发人员,这对我来说很难做到。我决定只从数据库中删除枚举类型,因为要么我没有正确使用节点,要么它们在我使用的
pg
gem中无法正常工作se设置我的配置,顺便说一句,它是这样做的:const{Client}=require(“pg”);const Client=new Client({connectionString:process.env.DATABASE_URL | | process.env.pg_CONNECTION_STRING});Client.connect()。我将以编程方式将列类型分配给varchar
,并以编程方式验证输入(如if(validate(gender)){//continue}否则{抛出新错误(“错误消息”))
通过添加检查约束,您可以获得由enum提供的相同数据库强制/验证。例如,要验证性别,只需“alter table users add constraint validate_SENDARY check(性别输入('MEAL'、'MENERAL'、'other');”这将自动验证,而不需要您以编程方式验证。
=> create temporary table test (a genderEnum);
=> insert into test values ('female');
INSERT 0 1
=> insert into test values ('{"female"}')
ERROR: invalid input value for enum genderenum: "{"female"}"