javascript – NodeJS和pg-promise,捕获PostgreSQL异常

我正在使用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’隔离开来.

解决方法

这是Postgresql的标准错误表示,它具有不可见的属性消息,因此调用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返回的所有错误.

这个问题给了我一个关于向拒绝结果添加属性消息的想法.总有改进的余地;)

UPDATE

在此之后,我更新了spex.batch拒绝实现以首先支持属性和消息,以便更容易地进行错误处理,并将其作为版本0.4.3发布.实现甚至比我最初的预期更好,因为第一个和消息支持嵌套batch结果.

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

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...