如何在Node.js中捕获psql错误?

4

我目前正在编写一个带有PostgreSQL数据库的后端节点服务器,尝试进行注册API设置。 我想要能够捕获由唯一性约束违反引起的错误。 我该怎么做?

function createMember(body, callBack){  
  // This function adds someone who is newly registered to the database.

  var id;
  var sql = 'INSERT INTO member (fname, lname, phone, email, age, gender) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id;';
  db.query(sql, [body.fname, body.lname, body.phone, body.email, body.age, body.gender]).then(res => {
      id = res.rows[0].id;
      if (id) {
        callBack(body);
        console.log("New member with id: " + id);
      }
  }).catch(e => {
      if (the error is a unique constraint violation){
        console.log("\n ERROR! \n Individual with name: " + body.fname + " " + body.lname + " and phone #: " + body.phone + " is a duplicate member. \n");
        callBack("Duplicate");
        return;
      }
      console.log("\n \n ERROR! \n Individual with name: " + body.fname + " " + body.lname + " and phone #: " + body.phone + " could not be added. \n", e);
      callBack(false);
      return e;
  })
}

db是从哪里来的,它是否已经执行了您下面展示的映射? - Adrian Klaver
db 是连接到数据库的 pg 客户端。另外,当你说“mapping”时,我不确定你的意思。如果你的意思是询问数据库是否以那种方式填充,那么是的。 - Osama Hafez
但是提供db的程序的名称是什么?通过映射,我的意思是它可能已经提供了错误名称,您可以根据此筛选,而不是查找代码。 - Adrian Klaver
我不确定您所说的程序名称是什么,它提供了 db ... 难道不只是 pg 客户端吗?Pg 是一个 Node 模块,可用于将 Node 实例作为客户端连接到 PostgreSQL 数据库。db 客户端是一个对象。 - Osama Hafez
另外,如果pg(Postgres)提供了带有键到代码的映射,我很乐意使用它们,但我还没有看到。据我所知,他们只是给我们提供了要使用的代码。 - Osama Hafez
1个回答

9

由于我没有找到任何关于这个问题的答案,所以我想分享我的解决方法。

在Postgresql中,每个错误都有一个错误代码,可以在以下网址找到: https://www.postgresql.org/docs/12/errcodes-appendix.html

如果你查看当唯一键冲突时得到的错误,你可能会注意到该代码是“23505”。

只需在catch块中添加一个检查,看看错误是否具有“23505”的代码。

function createMember(body, callBack){  
  // This function adds someone who is newly registered to the database.

  var id;
  var sql = 'INSERT INTO member (fname, lname, phone, email, age, gender) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id;';
  db.query(sql, [body.fname, body.lname, body.phone, body.email, body.age, body.gender]).then(res => {
      id = res.rows[0].id;
      if (id) {
        callBack(body);
        console.log("New member with id: " + id);
      }
  }).catch(e => {
      if (e.code == '23505'){
        console.log("\n ERROR! \n Individual with name: " + body.fname + " " + body.lname + " and phone #: " + body.phone + " is a duplicate member. \n");
        callBack("Duplicate");
        return;
      }
      console.log("\n \n ERROR! \n Individual with name: " + body.fname + " " + body.lname + " and phone #: " + body.phone + " cannot be added. \n", e);
      callBack(false);
      return e;
  })
}

1
感谢这个方法!我采用了不同的方法(我的电子邮件和用户名有唯一约束条件);因此我查看了如果(err.constraint === 'users_email_key'){返回有意义的消息}或如果(err.constraint === 'users_username_key'){返回有意义的消息} - mcshakes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接