我使用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'隔离。
答案 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拒绝实施以支持属性first
和message
,以便更轻松地处理错误,并将其作为版本0.4.3发布。该实现甚至比我最初的预期更好,因为first
和message
都支持嵌套的batch结果。
如果您将pg-promise
更新为4.1.10版(或更高版本),则可以通用方式记录此类错误:
.catch(error => {
console.log("ERROR:", error.message || error);
});
即使错误来自嵌套batch调用,它也会始终记录正确的错误消息。