NodeJS和pg-promise,捕获PostgreSQLexception

我正在运行NodeJS和pg-promise以及PostgreSQL后端。 我创build了自己的TRIGGER,在某些情况下会引发exception。 事情在这方面正常工作。

但是有了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”,但是如何作为文本string返回?

我尝试了与“closures”:

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

但我无法得到孤立的“vote_limit_exceeded”。

这是PostgreSQL的标准错误表示,它具有不可见的属性message ,所以调用error.message会给你预期的结果。

最好的是logging你的错误是这样的:

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

扩展你的代码示例…

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

所以对于你的具体情况,一个安全的错误日志将是:

 .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); }); 

当然,您可以轻松地将其更改为logging方法批处理返回的所有错误。

这个问题给了我一个关于添加属性message到拒绝结果的想法。 总有一个改进的空间;)

UPDATE

在此之后,我更新了spex.batch拒绝实现,以支持属性firstmessage ,以便于error handling,并将其作为版本0.4.3发布。 实现甚至比我最初想要的更好,因为firstmessage支持嵌套的批处理结果。

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

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

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