检查 Node-Postgres 中的 UNIQUE 约束
Check for UNIQUE constraint in Node-Postgres
我在我的 table 的“电子邮件”列上设置了 UNIQUE 约束,现在在我的 Express API 中使用了 Node-Postgres (pg),我想确保用户在发布学生时输入的电子邮件不重复。
我的问题是,如何才能显示“电子邮件已接收!”之类的回复?在我的 JSON 对象中,当该约束被违反时?
const createStudent = (req, res) => {
const { name, email, age, dob } = req.body;
pool.query(insertStudent, [name, email, age, dob], (error, results) => {
if (error) throw error;
res.status(201).json({
message: `Student Created Successfully!`,
student: results.rows[0],
});
});
};
您可以在此处找到 postgresql 返回的错误代码:
https://www.postgresql.org/docs/current/errcodes-appendix.html
unique_violation
的错误代码是 23505。此外,错误对象有 constraint
字段,报告违反约束的名称。因此
pool.query(..., (error, results) => {
if (error.code == 23505 && error.constraint == 'your_unique_cons_name') {
// handle error
}
});
编辑:
这是完整的代码,我不知道你到底从哪里得到这些错误,也许 post 你的代码和完整的错误消息。
if (error != null && error.code == 23505 && error.constraint == 'your_unique_cons_name') {
res.status(418).json({
message: `email taken!`,
});
}
else {
res.status(201).json({
message: `Student Created Successfully!`,
student: results.rows[0],
});
}
我设法通过使用 async/await
和 try/catch
并在 catch 语句中提供错误逻辑来解决问题。
这现在按预期工作:
const createStudent = async (req, res, next) => {
const { name, email, age, dob} = req.body;
try {
const create = await pool.query(insertStudent, [
name,
email,
age,
dob,
]);
res
.status(201)
.json({ message: "Student Created Successfully!", user: create.rows[0] });
} catch (err) {
// If UNIQUE constraint is violated
if (err.code == "23505") {
console.error(err.message);
const error = new Error("Email Already Exists!");
error.status = 400;
next(error);
} else {
console.error(err.message);
const error = new Error("Something Went Wrong!");
error.status = 500;
next(error);
}
}
};
我使用了 Express Error Handling 中间件,但其他方法也可以。
感谢@boran的大力帮助!
我在我的 table 的“电子邮件”列上设置了 UNIQUE 约束,现在在我的 Express API 中使用了 Node-Postgres (pg),我想确保用户在发布学生时输入的电子邮件不重复。
我的问题是,如何才能显示“电子邮件已接收!”之类的回复?在我的 JSON 对象中,当该约束被违反时?
const createStudent = (req, res) => {
const { name, email, age, dob } = req.body;
pool.query(insertStudent, [name, email, age, dob], (error, results) => {
if (error) throw error;
res.status(201).json({
message: `Student Created Successfully!`,
student: results.rows[0],
});
});
};
您可以在此处找到 postgresql 返回的错误代码:
https://www.postgresql.org/docs/current/errcodes-appendix.html
unique_violation
的错误代码是 23505。此外,错误对象有 constraint
字段,报告违反约束的名称。因此
pool.query(..., (error, results) => {
if (error.code == 23505 && error.constraint == 'your_unique_cons_name') {
// handle error
}
});
编辑: 这是完整的代码,我不知道你到底从哪里得到这些错误,也许 post 你的代码和完整的错误消息。
if (error != null && error.code == 23505 && error.constraint == 'your_unique_cons_name') {
res.status(418).json({
message: `email taken!`,
});
}
else {
res.status(201).json({
message: `Student Created Successfully!`,
student: results.rows[0],
});
}
我设法通过使用 async/await
和 try/catch
并在 catch 语句中提供错误逻辑来解决问题。
这现在按预期工作:
const createStudent = async (req, res, next) => {
const { name, email, age, dob} = req.body;
try {
const create = await pool.query(insertStudent, [
name,
email,
age,
dob,
]);
res
.status(201)
.json({ message: "Student Created Successfully!", user: create.rows[0] });
} catch (err) {
// If UNIQUE constraint is violated
if (err.code == "23505") {
console.error(err.message);
const error = new Error("Email Already Exists!");
error.status = 400;
next(error);
} else {
console.error(err.message);
const error = new Error("Something Went Wrong!");
error.status = 500;
next(error);
}
}
};
我使用了 Express Error Handling 中间件,但其他方法也可以。
感谢@boran的大力帮助!