Node.js 防止数据库(psql)在REST api上显示错误

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(

我目前正在用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(
    "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"});
   } 

}))

这仍然会导致数据库错误,但应用程序不会崩溃。应用程序不会崩溃,因为我已经说过了,我阻止了它。但我认为我的主要问题是:如何处理这种情况,以防止数据库错误。是否有必要在插入数据库行之前先检查它?