NodeJS和pg-promise,捕获PostgreSQL异常

Mic*_*sen 7 javascript postgresql node.js pg-promise

我正在使用PostgreSQL后端运行NodeJS和pg-promise.我创建了自己的TRIGGER,在某些情况下引发异常.事情在这方面很好.

但是使用pg-promise我无法捕获错误的名称.

使用此代码:

...
.catch(function(err) {
    console.log(err);
});
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

[ { 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' } } ]
Run Code Online (Sandbox Code Playgroud)

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

我尝试过"接近":

console.log(err[0].result);
Run Code Online (Sandbox Code Playgroud)

但是我无法将'vote_limit_exceeded'隔离开来.

vit*_*y-t 6

这是PostgreSQL的标准错误表示,它具有不可见的属性message,因此调用error.message将为您提供预期的结果.

最好的是记录你的错误,如下所示:

console.log(error.message || error);
Run Code Online (Sandbox Code Playgroud)

扩展您的代码示例...

看起来您的错误上下文来自调用批处理函数的结果.这意味着在这种情况下,您也可以调用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);
});
Run Code Online (Sandbox Code Playgroud)

当然,您可以轻松更改它以记录方法批处理返回的所有错误.

这个问题给了我一个关于message为拒绝结果添加属性的想法.总有改进的余地;)

UPDATE

在此之后,我更新了spex.batch拒绝实现以支持属性,first并且message为了更容易的错误处理,并将其作为版本0.4.3发布.实现甚至比我最初打算,因为这两个firstmessage支持嵌套批次的结果.

如果更新pg-promise到4.1.10(或更高版本),则可以通用方式记录此类错误:

.catch(error => {
    console.log("ERROR:", error.message || error);
});
Run Code Online (Sandbox Code Playgroud)

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