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拒绝实现,以支持属性first
和message
,以便于error handling,并将其作为版本0.4.3发布。 实现甚至比我最初想要的更好,因为first
和message
支持嵌套的批处理结果。
如果您将pg-promise
更新到版本4.1.10(或更高版本),那么您可以以通用方式logging此类错误:
.catch(error => { console.log("ERROR:", error.message || error); });
它将始终logging正确的错误消息,即使错误来自嵌套的批处理调用。