Node.js 防止数据库(psql)在REST api上显示错误
我目前正在用NodeJS实现restapi。但是,我想知道如何防止数据库错误,例如,当我再次插入一行时,这违反了约束规则 我的代码如下所示:Node.js 防止数据库(psql)在REST api上显示错误,node.js,postgresql,rest,Node.js,Postgresql,Rest,我目前正在用NodeJS实现restapi。但是,我想知道如何防止数据库错误,例如,当我再次插入一行时,这违反了约束规则 我的代码如下所示: router.put("/like/:id", async (req, res) => { const id = req.params.id; const liked = req.body.liked; const user = req.body.user; const result = await db.query(
router.put("/like/:id", async (req, res) => {
const id = req.params.id;
const liked = req.body.liked;
const user = req.body.user;
const result = await db.query(
"INSERT INTO abc (t_id, m_id) VALUES ($1,$2)",
[id, user.id]
);
res.sendStatus(200);
});
因此,当有人第二次访问路径/like/1
时,我得到:
error: duplicate key value violates unique constraint
我目前正在记录数据库错误,应用程序没有崩溃,但我想知道如何才能使它更好。我想我的主要问题是:在插入之前,我是否必须首先查询数据库以防止错误?这会起作用,但它也会使应用程序的速度稍微慢一点,因为还有一个额外的查询
谢谢大家! 您必须编写一个查询来检查记录是否已经存在,我认为这不会导致任何大的性能问题。您还可以查找
UPSERT
查询:
所以,如果您想避免DB错误,可以编写一个额外的查询或进行upsert。
如果您想避免额外的查询,Upsert将是最佳选择
使用try-catch块来处理错误
router.put("/like/:id", async (req, res) => {
const id = req.params.id;
const liked = req.body.liked;
const user = req.body.user;
try {
// upsert query1 with no update
let query = "INSERT INTO abc (t_id,m_id) VALUES ($1,$2) ON CONFLICT (t_id)
DO NOTHING";
/* query with update
"INSERT INTO abc (t_id,m_id) VALUES ($1,$2) ON CONFLICT (
t_id) UPDATE SET t_id = {{t_id}}"
*/
const result = await db.query(
query,
[id, user.id]
);
res.sendStatus(200);
}
catch (err) {
// handle error here with a custom error message
res.status(400).send({msg:"any message"});
}
})) 这仍然会导致数据库错误,但应用程序不会崩溃。应用程序不会崩溃,因为我已经说过了,我阻止了它。但我认为我的主要问题是:如何处理这种情况,以防止数据库错误。是否有必要在插入数据库行之前先检查它?