NodeJS和pg promise,捕获PostgreSQL异常

NodeJS and pg-promise, catch PostgreSQL exceptions

本文关键字:捕获 PostgreSQL 异常 promise pg NodeJS      更新时间:2023-09-26

我正在使用PostgreSQL后端运行NodeJS和pg promise。我创建了自己的触发器,在某些情况下会抛出异常。事情进展顺利。

但是有了pg promise,我很难找到错误的名字。

使用此代码:

...
.catch(function(err) {
    console.log(err);
});

我得到以下输出:

[ { success: false,
result: 
 { [error: vote_limit_exceeded]
   name: 'error',
   length: 80,
   severity: 'ERROR',
   code: 'P0001',
   detail: undefined,
   hint: undefined,
   position: undefined,
   internalPosition: undefined,
   internalQuery: undefined,
   where: undefined,
   schema: undefined,
   table: undefined,
   column: undefined,
   dataType: undefined,
   constraint: undefined,
   file: 'pl_exec.c',
   line: '3068',
   routine: 'exec_stmt_raise' } } ]

我可以在上下文中看到名称"vote_limit_exceeded",但如何作为文本字符串返回?

我尝试过"接近":

console.log(err[0].result);

但我无法隔离"vote_limit_exceeded"。

这是PostgreSQL的标准错误表示,它具有不可见的属性message,因此调用error.message会得到预期的结果。

最好的是这样记录你的错误:

console.log(error.message || error);

扩展您的代码示例

您的错误上下文似乎来自调用批处理函数的结果。这意味着在这种情况下,您也可以调用error.getErrors()[0]来获得发现的第一个错误。

因此,对于您的特定情况,一个安全的错误日志记录是:

.catch(error => {
    if (Array.isArray(error) && 'getErrors' in error) {
        // the error came from method `batch`;
        // let's log the very first error:
        error = error.getErrors()[0];
    }
    console.log("ERROR:", error.message || error);
});

当然,您可以很容易地将其更改为记录方法批处理返回的所有错误。

这个问题让我了解了如何将属性message添加到拒绝结果中。总有改进的余地;)

更新

在此之后,我更新了spec.batch-rejection实现,以支持属性firstmessage,从而更容易地处理错误,并将其发布为0.4.3版本。实现甚至比我最初预期的要好,因为firstmessage都支持嵌套的批处理结果。

如果您将pg-promise更新到4.1.10版本(或更高版本),那么您可以用一种通用的方式记录此类错误:

.catch(error => {
    console.log("ERROR:", error.message || error);
});

它将始终记录正确的错误消息,即使错误来自嵌套的批处理调用。