NodeJS和pg-promise,捕获PostgreSQL异常

时间:2016-05-16 09:10:01

标签: javascript node.js postgresql pg-promise

我使用PostgreSQL后端运行NodeJS和pg-promise。 我创建了自己的TRIGGER,在某些情况下抛出异常。事情在这方面运作良好。

但是使用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'隔离。

1 个答案:

答案 0 :(得分:6)

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

最好的是记录你的错误:

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

扩展您的代码示例...

看起来您的错误上下文来自调用batch函数的结果。这意味着在这种情况下,您也可以调用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);
});

当然,您可以轻松更改它以记录方法batch返回的所有错误。

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

<强>更新

在此之后,我更新了spex.batch拒绝实施以支持属性firstmessage,以便更轻松地处理错误,并将其作为版本0.4.3发布。该实现甚至比我最初的预期更好,因为firstmessage都支持嵌套的batch结果。

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

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

即使错误来自嵌套batch调用,它也会始终记录正确的错误消息。