NodeJS 和 pg-promise,捕获 PostgreSQL 异常
NodeJS and pg-promise, catch PostgreSQL exceptions
我 运行 NodeJS 和 pg-promise 与 PostgreSQL 后端。
我创建了自己的 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',但如何将 return 作为文本字符串?
我尝试通过以下方式获取 "close":
console.log(err[0].result);
但我无法隔离 'vote_limit_exceeded'。
这是 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 调用。
我 运行 NodeJS 和 pg-promise 与 PostgreSQL 后端。 我创建了自己的 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',但如何将 return 作为文本字符串?
我尝试通过以下方式获取 "close":
console.log(err[0].result);
但我无法隔离 'vote_limit_exceeded'。
这是 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 调用。